ホームページ  >  記事  >  バックエンド開発  >  Yii2 プログラミング: セキュリティ

Yii2 プログラミング: セキュリティ

PHPz
PHPzオリジナル
2023-09-04 23:01:04592ブラウズ

Yii2 プログラミング: セキュリティ

「Yii とは何ですか?」という場合は、Yii フレームワークの紹介 を参照してください。 Yii の利点と Yii 2.0 の概要が含まれています。

この Yii2 によるプログラミング シリーズでは、読者に Yii2 PHP フレームワークの使用方法を説明します。アプリを一般のユーザーと共有する予定がある場合は、安全である必要があり、最初からそのための計画を立てることが最善です。幸いなことに、Yii のようなフレームワークを使用すると、他のフレームワークよりもこれがはるかに簡単になります。 Yii の機能に記載されているとおり:

Yii には、SQL インジェクション、クロスサイト スクリプティング (XSS)、クロスサイト リクエスト フォージェリ (CSRF)、Cookie 改ざんなどの攻撃から Web アプリケーションを保護するための多くのセキュリティ対策が備わっています。

このチュートリアルでは、Yii アプリケーションフレームワーク内の基本的なセキュリティ概念について説明します。ご興味がございましたら、リリース シリーズのミーティング プランナー アプリがアルファ版に近づくにつれて、今後のエピソードではアプリの安全性を維持することに専念する予定です。

始める前に、私は以下の議論に参加しようとしていることに留意してください。ご質問やトピックの提案がございましたら、以下にコメントを残すか、Twitter @reifman までご連絡ください。

注: 「Programming Yii」シリーズのエピソードの間に空白があることに気づいた場合、それは私が昨年脳手術を受けなければならなかったからです。忍耐とサポートに感謝します。また定期的に記事を書けるのは素晴らしいことです。今後も Yii2 について取り上げていくことを楽しみにしています。

Yii セキュリティの基本

Web アプリケーションのセキュリティを初めて使用する場合は、Yii 製品について知っておくべきことがたくさんあります。最良の Yii 2.0 ドキュメントに基づいて概要を提供してみます。 Yii チームはセキュリティを 7 つの主要領域に分けています:

  1. 認証
  2. 認可
  3. パスワードを使用する
  4. 暗号化
  5. セキュリティを表示
  6. 認証クライアント
  7. ###ベストプラクティス###
  8. これらを 1 つずつ掘り下げてみましょう。

###1。認証

Ilko Kacharov の Yii Framework Security Demo では、認証 (および次のサブトピックである認可) の目的を要約したいくつかの役立つスライドが提供されています。基本的に、これらのトピックで回答する必要がある質問は次のとおりです:

ユーザーは誰ですか?

    ユーザーは彼らが言うとおりのユーザーですか?
  • ユーザーにはリソースにアクセスする権限がありますか?
  • ユーザーには操作を実行する権限がありますか?
  • ユーザーにはリソースに対して操作を実行する権利がありますか?
  • ユーザーモデルとアイデンティティインターフェイス
Yii の yii/web/User クラスは yii\web\IdentityInterface と統合して、アプリケーション内のユーザーの認証状態を管理します。

昨年の 11 月、私は Yii アドバンスト アプリケーション テンプレートに関するチュートリアルを書きました。プレミアム テンプレートの利点の 1 つは、ユーザー モデルと ActiveRecord およびデータベースの事前構築された統合が提供されることです。したがって、アプリケーションはデータベース主導の認証を即座に提供します。

ユーザー モデルを使用すると、ユーザーをプログラムでログインおよびログアウトできます:

login() は、指定された ID を設定し、セッションと Cookie の認証状態を記憶します。

    logout() はユーザーをゲストとしてマークし、セッションと Cookie から関連情報を消去します。
  • setIdentity(): セッションや Cookie に触れることなくユーザーの ID を変更します。これは API 機能に最適です。
  • $isGuest プロパティは、現在のユーザーがログインしているかどうかを決定します。ユーザーがログアウトすると null ですが、それ以外の場合は IdentityInterface のインスタンスを返します。

基本的には、次のような ActiveRecord を拡張し、IdentityInterface をサポートするメソッドを実装する User クラスが必要です。 リーリー

さらに、ユーザーを作成する前に、アプリケーションは認証キーとしてランダムな文字列を生成します。これは、「パスワードを忘れた場合」メールまたはその他のメールベースのログイン リンクで使用できます:

リーリー

認可

Yii には 2 つの組み込み認証メソッドが用意されています。より単純なアクセス制御リスト (ACL) は、リソースに対する操作の実行を許可されるユーザーまたはプロセスを決定します。一方、より集中的なロールベースのアクセス制御 (RBAC) は、ロールを定義することでアクセスを管理するのに役立ちます。 RBAC では、特定の役割を持つユーザーまたはシステム タスクのみが特定の操作を実行できます。

アクセス制御リスト

ACL は、アクセス制御フィルター (ACF) と呼ばれることもあります。 Yii は、yii\filters\AccessControl で ACL サポートを提供します。単純なアクセス制御のみを必要とするアプリケーションに最適です。これまでに Meeting Planner で使用してきたものは次のとおりです。

以下は、利用可能なアクション (通常はページ) へのアクセスをフィルターするアクセス動作を構成する一般的な SiteController の例です。この例では、ACL は登録、ログイン、およびログアウトに適用されます。

'?'

は、すべてのユーザーがログイン ページと登録ページにアクセスできることを意味し、

'@'

は、ログインしているユーザーまたは認証されたユーザーのみにアクセスが許可されることを意味します。次の例では、ログインしているユーザーのみがログアウトできます:

use yii\web\Controller;
use yii\filters\AccessControl;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['login', 'logout', 'signup'],
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['login', 'signup'],
                        'roles' => ['?'],
                    ],
                    [
                        'allow' => true,
                        'actions' => ['logout'],
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }
    // ...
}

随着控制器的增长,每个新操作都需要在访问控制规则中定义。而且,随着应用程序的增长,每个控制器及其所有操作都需要集成 ACL 过滤以确保安全。

基于角色的访问控制

基于角色的访问控制(RBAC)提供了更强大的身份验证系统,但也需要更多的前期设计和实现。

使用 RBAC,您可以通过可以继承(或不可继承)的角色来定义身份验证,并将角色应用于用户。您还可以定义角色规则。 RBAC 实现可能会变得相当复杂。

在下图中,管理员可以执行任何任务,作者可以创建帖子并更新自己的帖子。 Jane 是管理员,因此她可以执行管理员的任务,而 John 只是作者:

Yii2 プログラミング: セキュリティ

Yii 实现了所谓的“通用分层 RBAC,遵循 NIST RBAC 模型”。 RBAC 功能由其 authManager 应用程序组件提供。

我不会在这里深入探讨 RBAC,但我希望在以后的教程中能够深入探讨。再说一次,这取决于编辑女神——与她们交谈绝非易事:

Yii2 プログラミング: セキュリティ

基本上,要彻底实施 RBAC,您必须:

  • 定义角色和权限
  • 建立您的角色和权限之间的关系
  • 定义任何现有的规则
  • 将规则与您的角色和权限相关联
  • 最后,为用户分配角色

您可以在下面看到启用 RBAC 系统所需的代码:

<?php
namespace app\commands;

use Yii;
use yii\console\Controller;

class RbacController extends Controller
{
    public function actionInit()
    {
        $auth = Yii::$app->authManager;

        // add "createPost" permission
        $createPost = $auth->createPermission('createPost');
        $createPost->description = 'Create a post';
        $auth->add($createPost);

        // add "updatePost" permission
        $updatePost = $auth->createPermission('updatePost');
        $updatePost->description = 'Update post';
        $auth->add($updatePost);

        // add "author" role and give this role the "createPost" permission
        $author = $auth->createRole('author');
        $auth->add($author);
        $auth->addChild($author, $createPost);

        // add "admin" role and give this role the "updatePost" permission
        // as well as the permissions of the "author" role
        $admin = $auth->createRole('admin');
        $auth->add($admin);
        $auth->addChild($admin, $updatePost);
        $auth->addChild($admin, $author);

        // Assign roles to users. 1 and 2 are IDs returned by IdentityInterface::getId()
        // usually implemented in your User model.
        $auth->assign($author, 2);
        $auth->assign($admin, 1);
    }
}

要实现 RBAC,您必须准备好预先编写大量代码,或者随着应用程序的增长而编写大量代码。而且,如果您这样做,Yii 将根据您定义的身份验证框架来管理身份验证。换句话说,预先设计和编码可以提供可靠、详细的身份验证。

使用密码

正如马克·扎克伯格 (Mark Zuckerberg) 在 6 月份了解到的那样,一些网站以纯文本形式存储用户密码,但您的网站不应该这样做;公平地说,在密码管理器时代之前,我的 Facebook 帐户曾经因 PHPList 所做的事情而被黑客入侵过。不管怎样,Yii 使得加密和安全验证密码变得很容易。

Yii 的 crypt 函数使用 bcrypt 为您的密码生成哈希值。当人们注册时,会创建一个哈希值:

$hash = Yii::$app->getSecurity()->generatePasswordHash($password);

然后,当用户尝试登录时,它会被散列并与数据库中的散列进行比较:

if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
    // all good, logging user in
} else {
    // wrong password
}

但是您也可以使用 Yii 通过加密来保护数据。

密码学

Yii 框架提供了许多内置功能来支持数据保护:

  • 密码和密钥生成函数,例如generateRandomKey、generateRandomString 和generateSalt。
  • 密码验证:generatePasswordHash() 和 validatePassword()。
  • 加密/解密:encryptByKey()、decryptByKey()、encryptByPassword() 和 decryptByPassword()。
  • 使用标准算法派生密钥:pbkdf2() 和 hkdf()。
  • 防止数据篡改:hashData() 和 validateData()。

查看安全性

来自用户的任何数据都可能受到 SQL 注入或跨浏览器脚本等攻击的感染。重要的是,您在视图中输出给用户的任何数据都应该被清理。 Yii 为此提供了几种方法。

首先,有 Html::encode,它基本上破坏了任何 SQL 或脚本:

<?php
use yii\helpers\Html;
?>

<div class="username">
    <?= Html::encode($user->name) ?>
</div>

并且与 HtmlPurifier 库集成以实现更大的文本块:

<?php
use yii\helpers\HtmlPurifier;
?>

<div class="post">
    <?= HtmlPurifier::process($post->text) ?>
</div>

通过身份验证客户端登录

Yii 还提供了第三方身份验证的功能,这对于支持通过 Google、Facebook、Twitter 等进行社交登录尤其有用。

我为 Envato Tuts+ 编写了几篇关于在 Yii 框架内使用 AuthClient 进行社交登录的教程:

  • 构建您的初创公司:使用 AuthClient 简化入口(待发布
  • 如何使用 Yii2 进行编程:Google 身份验证
  • 如何使用 Yii2 进行编程:AuthClient 与 Twitter、Google 和其他网络集成

我发现社交登录对于会议策划者来说效果非常好。新用户无需密码即可开始安排会议。

最佳实践

Yii 还推荐了一些 Web 应用程序安全方面的最佳实践。它的文档为任何人提供了有关这些主题的良好入门知识。

  1. 过滤输入和输出
  2. 避免 SQL 注入
  3. 避免跨站脚本 (XSS)
  4. 避免跨站请求伪造 (CSRF)
  5. 避免文件泄露
  6. 在生产中避免调试信息和工具
  7. 使用通过 TLS 的安全连接

上面的前三个主题可以通过上面视图安全中讨论的编码得到很好的管理。

Yii は、一般的なアクティビティに対する組み込みの CSRF 保護も提供しており、必要に応じてオフにすることができます。 Meeting Planner で、Mailgun の API サービスから発行されたメッセージを受け入れるには、CSRF をオフにする必要があります。

ファイル公開の場合、フレームワークはすべての受信リクエストを web/index.php リクエスト ファイルに集中させることで、これを最小限に抑えます。これにより、リクエストをフィルタリングするアプリケーション コードを作成する必要性が大幅に制限されます。一か所でしっかり管理されています。

最後に、HTTPS を使用すると、接続を保護し、Yii でユーザーを保護することができます。今年の初めに、Let's Encrypt に関する記事を書きました。このチュートリアルを使用して、Yii アプリケーションに HTTPS をインストールすることもできます。

###もっと知りたい?

これらのトピックに関するさらに詳細な資料を読みたい場合は、Yii 1.x フレームワークがこれらの投稿を提供しています。確かに、それらは古いもので、Yii 2 に特化したものではありませんが、それでも役に立ちます。

    特別なトピック: セキュリティ
  • 安全な Yii アプリケーションを作成する方法
  • Yii セキュリティ拡張ガイド
  • ###エンディング######

Yii2 セキュリティの概要を楽しんでいただけたでしょうか。上記の概念のほとんどまたはすべての側面をアプリケーションに統合すると、基本的に安全な Web サービスが得られます。これらのセキュリティ対策の実際の動作を確認するには、「Building Your Startup with PHP」シリーズを参照してください。

フレームワークのさまざまな側面を引き続き掘り下げていくため、「Yii2 によるプログラミング」シリーズの今後のチュートリアルをチェックしてください。機能やテーマのリクエストも歓迎します。以下のコメント欄に投稿するか、私の Lookahead Consulting Web サイトから電子メールを送ってください。

次の Yii2 チュートリアルがいつリリースされるか知りたい場合は、Twitter で @reifman をフォローするか、私のインストラクター ページをチェックしてください。私のインストラクター ページには、このシリーズのすべての記事がすぐに含まれます。

編集の女神たちを幸せにするために一緒に働きましょう。

###関連リンク###

Yii ベストセキュリティプラクティス

Yii 基本セキュリティクラス

Yii2 開発者交流会

以上がYii2 プログラミング: セキュリティの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。