ホームページ >バックエンド開発 >PHPチュートリアル >PHP は偽のクロスサイトリクエスト実装プログラムを防止します_PHP チュートリアル
CSRF オフサイト型の脆弱性は、実際には従来の意味での外部送信データの問題です。ただし、プログラマーは、SPAM の問題を防ぐために、コメントを残すなどのいくつかのフォームにウォーターマークを追加することを検討します。一部の操作は実行できない場合があります。制限がないため、攻撃者はまずリクエスト パラメータを予測し、サイト外の Web ページに JavaScript スクリプトを記述してファイル リクエストを偽造したり、フォームを自動的に送信して GET および POST リクエストを実装したりすることができます。リンクをクリックして Web ページの外部サイトにアクセスすると、クライアントは強制的にリクエストを開始します。
ブラウザのセキュリティ上の欠陥
現在のほぼすべての Web アプリケーションは、ユーザーを識別し、セッション状態を保存するために Cookie を使用します。ただし、すべてのブラウザーは、最初に Cookie 機能を追加したときに、次の図に示すように、セキュリティ要素を考慮していませんでした。 、Web ページの通常の画像によって生成されたリクエストも COOKIE をもたらします:
http://website.com/log.jpg を取得
Cookie: session_id
クライアント——————————————————-サーバー
このアイデアに従い、crumb の実装をコピーします。コードは次のとおりです。
コードは次のとおりです | コードをコピー |
クラス クラム {
CONST SALT = "あなたの秘密の塩";
静的 $ttl = 7200;
静的パブリック関数チャレンジ($data) {
戻り値 hash_hmac('md5', $data, self::SALT); } 静的パブリック関数 issueCrumb($uid, $action = -1) { $i = ceil(time() / self::$ttl); return substr(self::challenge($i . $action . $uid), -12, 10); } static public function verifyCrumb($uid, $crumb, $action = -1) { $i = ceil(time() / self::$ttl); if(substr(self::challenge($i . $action . $uid), -12, 10) == $crumb || substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb) true を返します。 false を返します。 } } |
$uid はユーザーの一意の識別子を表し、$ttl はこのランダムな文字列の有効時間を表します。
応用例
非表示のランダムな文字列のくずをフォームに挿入します
コードは次のとおりです | コードをコピー |
プロセスフォームdemo.php
クラムをチェックしてください
コードは次のとおりです | コードをコピー |
if(Crumb::verifyCrumb($uid, $_POST['crumb'])) { |
注:
CSRF 攻撃とそれに関連する Web ワームの発生、およびそのような Web 攻撃に対する効果的な緊急対策を開発する。また、プログラマは $_REQUEST クラス変数を乱用しないこと、必要に応じて特定の機密操作にウォーターマークを追加すること、ハッカーによるリクエスト パラメータの予測の困難さを改善するために DISCUZ フォーラムと同様のフォームハッシュ テクノロジの使用を検討すること、およびセキュリティ問題に注意を払うことをお勧めします。 JSON データインターフェースなど