目次
Yii セキュリティの基本
ACL は、アクセス制御フィルター (ACF) と呼ばれることもあります。 Yii は、yii\filters\AccessControl で ACL サポートを提供します。単純なアクセス制御のみを必要とするアプリケーションに最適です。これまでに Meeting Planner で使用してきたものは次のとおりです。
は、すべてのユーザーがログイン ページと登録ページにアクセスできることを意味し、
基于角色的访问控制
使用密码
密码学
查看安全性
通过身份验证客户端登录
最佳实践
ホームページ バックエンド開発 PHPチュートリアル Yii2 プログラミング: セキュリティ

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

Sep 04, 2023 pm 11:01 PM
プログラミング yii 安全性

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

正規表現を使用してPHP配列から重複した値を削除します 正規表現を使用してPHP配列から重複した値を削除します Apr 26, 2024 pm 04:33 PM

正規表現を使用して PHP 配列から重複値を削除する方法: 正規表現 /(.*)(.+)/i を使用して、重複値を照合して置換します。配列要素を反復処理し、preg_match を使用して一致をチェックします。一致する場合は値をスキップし、一致しない場合は重複値のない新しい配列に追加します。

Java 関数のメモリ管理技術とセキュリティの間にはどのような関係がありますか? Java 関数のメモリ管理技術とセキュリティの間にはどのような関係がありますか? May 02, 2024 pm 01:06 PM

Java のメモリ管理には、ガベージ コレクションと参照カウントを使用してメモリの割り当て、使用、再利用を行う自動メモリ管理が含まれます。効果的なメモリ管理は、バッファ オーバーフロー、ワイルド ポインタ、メモリ リークを防ぎ、プログラムの安全性を向上させるため、セキュリティにとって非常に重要です。たとえば、不要になったオブジェクトを適切に解放することでメモリ リークを回避でき、それによってプログラムのパフォーマンスが向上し、クラッシュを防ぐことができます。

プログラミングは何のためにあるのか、それを学ぶと何の役に立つのか? プログラミングは何のためにあるのか、それを学ぶと何の役に立つのか? Apr 28, 2024 pm 01:34 PM

1. プログラミングは、Web サイト、モバイル アプリケーション、ゲーム、データ分析ツールなど、さまざまなソフトウェアやアプリケーションの開発に使用できます。その応用分野は非常に幅広く、科学研究、医療、金融、教育、エンターテイメントなど、ほぼすべての業界をカバーしています。 2. プログラミングを学ぶことは、問題解決スキルと論理的思考スキルを向上させるのに役立ちます。プログラミング中、問題を分析して理解し、解決策を見つけてコードに変換する必要があります。この考え方は、分析能力と抽象能力を養い、実際的な問題を解決する能力を向上させることができます。

C++ コンテナ ライブラリのイテレータの安全性の保証 C++ コンテナ ライブラリのイテレータの安全性の保証 Jun 05, 2024 pm 04:07 PM

C++ コンテナ ライブラリは、イテレータの安全性を確保するための次のメカニズムを提供します: 1. コンテナの不変性の保証、 3. ループの範囲、 5. 例外の安全性。

コーディングの鍵: 初心者のための Python の力を解き放つ コーディングの鍵: 初心者のための Python の力を解き放つ Oct 11, 2024 pm 12:17 PM

Python は、学習の容易さと強力な機能により、初心者にとって理想的なプログラミング入門言語です。その基本は次のとおりです。 変数: データ (数値、文字列、リストなど) を保存するために使用されます。データ型: 変数内のデータの型 (整数、浮動小数点など) を定義します。演算子: 数学的な演算と比較に使用されます。制御フロー: コード実行のフロー (条件文、ループ) を制御します。

C++ プログラミング パズルのコレクション: 思考を刺激し、プログラミング スキルを向上させます C++ プログラミング パズルのコレクション: 思考を刺激し、プログラミング スキルを向上させます Jun 01, 2024 pm 10:26 PM

C++ プログラミング パズルは、フィボナッチ数列、階乗、ハミング距離、配列の最大値と最小値などのアルゴリズムとデータ構造の概念をカバーします。これらのパズルを解くことで、C++ の知識を強化し、アルゴリズムの理解とプログラミング スキルを向上させることができます。

Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Oct 11, 2024 pm 08:58 PM

Python は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

Golang を使用して HTTP ファイル アップロードのセキュリティを実装するにはどうすればよいですか? Golang を使用して HTTP ファイル アップロードのセキュリティを実装するにはどうすればよいですか? Jun 01, 2024 pm 02:45 PM

Golang で HTTP ファイル アップロード セキュリティを実装するには、次の手順に従う必要があります。 ファイル タイプを確認します。ファイルサイズを制限します。ウイルスやマルウェアを検出します。ファイルを安全に保管します。

See all articles