ホームページ >バックエンド開発 >PHPチュートリアル >PHP は偽のクロスサイトリクエスト実装プログラムを防止します_PHP チュートリアル

PHP は偽のクロスサイトリクエスト実装プログラムを防止します_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:10:481168ブラウズ

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 データインターフェースなど

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629636.html技術記事 CSRF オフサイト タイプの脆弱性は、実際には従来の意味での外部送信データの問題です。一般にプログラマは、スパム問題を防ぐために、メッセージやコメントを残すなどのいくつかのフォームにウォーターマークを追加することを検討します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。