「Yii とは何ですか?」という場合は、Yii フレームワークの紹介 を参照してください。 Yii の利点と Yii 2.0 の概要が含まれています。
この Yii2 によるプログラミング シリーズでは、読者に Yii2 PHP フレームワークの使用方法を説明します。アプリを一般のユーザーと共有する予定がある場合は、安全である必要があり、最初からそのための計画を立てることが最善です。幸いなことに、Yii のようなフレームワークを使用すると、他のフレームワークよりもこれがはるかに簡単になります。 Yii の機能に記載されているとおり:
Yii には、SQL インジェクション、クロスサイト スクリプティング (XSS)、クロスサイト リクエスト フォージェリ (CSRF)、Cookie 改ざんなどの攻撃から Web アプリケーションを保護するための多くのセキュリティ対策が備わっています。
このチュートリアルでは、Yii アプリケーションフレームワーク内の基本的なセキュリティ概念について説明します。ご興味がございましたら、リリース シリーズのミーティング プランナー アプリがアルファ版に近づくにつれて、今後のエピソードではアプリの安全性を維持することに専念する予定です。
始める前に、私は以下の議論に参加しようとしていることに留意してください。ご質問やトピックの提案がございましたら、以下にコメントを残すか、Twitter @reifman までご連絡ください。
注: 「Programming Yii」シリーズのエピソードの間に空白があることに気づいた場合、それは私が昨年脳手術を受けなければならなかったからです。忍耐とサポートに感謝します。また定期的に記事を書けるのは素晴らしいことです。今後も Yii2 について取り上げていくことを楽しみにしています。
Web アプリケーションのセキュリティを初めて使用する場合は、Yii 製品について知っておくべきことがたくさんあります。最良の Yii 2.0 ドキュメントに基づいて概要を提供してみます。 Yii チームはセキュリティを 7 つの主要領域に分けています:
Ilko Kacharov の Yii Framework Security Demo では、認証 (および次のサブトピックである認可) の目的を要約したいくつかの役立つスライドが提供されています。基本的に、これらのトピックで回答する必要がある質問は次のとおりです:
ユーザーは誰ですか?
ユーザー モデルを使用すると、ユーザーをプログラムでログインおよびログアウトできます:
login() は、指定された ID を設定し、セッションと Cookie の認証状態を記憶します。
基本的には、次のような ActiveRecord を拡張し、IdentityInterface をサポートするメソッドを実装する User クラスが必要です。 リーリー
さらに、ユーザーを作成する前に、アプリケーションは認証キーとしてランダムな文字列を生成します。これは、「パスワードを忘れた場合」メールまたはその他のメールベースのログイン リンクで使用できます:
リーリー認可
Yii には 2 つの組み込み認証メソッドが用意されています。より単純なアクセス制御リスト (ACL) は、リソースに対する操作の実行を許可されるユーザーまたはプロセスを決定します。一方、より集中的なロールベースのアクセス制御 (RBAC) は、ロールを定義することでアクセスを管理するのに役立ちます。 RBAC では、特定の役割を持つユーザーまたはシステム タスクのみが特定の操作を実行できます。
アクセス制御リスト
以下は、利用可能なアクション (通常はページ) へのアクセスをフィルターするアクセス動作を構成する一般的な 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 只是作者:
Yii 实现了所谓的“通用分层 RBAC,遵循 NIST RBAC 模型”。 RBAC 功能由其 authManager 应用程序组件提供。
我不会在这里深入探讨 RBAC,但我希望在以后的教程中能够深入探讨。再说一次,这取决于编辑女神——与她们交谈绝非易事:
基本上,要彻底实施 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 框架提供了许多内置功能来支持数据保护:
来自用户的任何数据都可能受到 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 进行社交登录的教程:
我发现社交登录对于会议策划者来说效果非常好。新用户无需密码即可开始安排会议。
Yii 还推荐了一些 Web 应用程序安全方面的最佳实践。它的文档为任何人提供了有关这些主题的良好入门知识。
上面的前三个主题可以通过上面视图安全中讨论的编码得到很好的管理。
Yii は、一般的なアクティビティに対する組み込みの CSRF 保護も提供しており、必要に応じてオフにすることができます。 Meeting Planner で、Mailgun の API サービスから発行されたメッセージを受け入れるには、CSRF をオフにする必要があります。
ファイル公開の場合、フレームワークはすべての受信リクエストを web/index.php リクエスト ファイルに集中させることで、これを最小限に抑えます。これにより、リクエストをフィルタリングするアプリケーション コードを作成する必要性が大幅に制限されます。一か所でしっかり管理されています。
最後に、HTTPS を使用すると、接続を保護し、Yii でユーザーを保護することができます。今年の初めに、Let's Encrypt に関する記事を書きました。このチュートリアルを使用して、Yii アプリケーションに HTTPS をインストールすることもできます。
###もっと知りたい?
フレームワークのさまざまな側面を引き続き掘り下げていくため、「Yii2 によるプログラミング」シリーズの今後のチュートリアルをチェックしてください。機能やテーマのリクエストも歓迎します。以下のコメント欄に投稿するか、私の Lookahead Consulting Web サイトから電子メールを送ってください。
次の Yii2 チュートリアルがいつリリースされるか知りたい場合は、Twitter で @reifman をフォローするか、私のインストラクター ページをチェックしてください。私のインストラクター ページには、このシリーズのすべての記事がすぐに含まれます。
編集の女神たちを幸せにするために一緒に働きましょう。
###関連リンク###Yii ベストセキュリティプラクティス
Yii 基本セキュリティクラス
以上がYii2 プログラミング: セキュリティの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。