ホームページ >php教程 >php手册 >偽のクロスサイトリクエストを防ぐためのヒント

偽のクロスサイトリクエストを防ぐためのヒント

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-21 08:52:241249ブラウズ

偽のクロスサイトリクエストの概要

偽のクロスサイト リクエストは防ぐのが難しく、攻撃者がこの方法を使用していたずら、スパム メッセージの送信、データの削除などを行う可能性があります。この攻撃の一般的な形式は次のとおりです:

ユーザーを誘導してクリックさせたり、ユーザーが知らずにアクセスできるようにするための偽造リンク

ユーザーに送信を促すための偽造フォーム。フォームを非表示にしたり、画像やリンクに見せかけたりすることができます。

一般的で安価な防止方法は、ユーザーの書き込み操作が関与する可能性のあるすべてのフォームにランダムで頻繁に変更される文字列を追加し、フォームの処理時にこの文字列をチェックすることです。このランダムな文字列が現在のユーザー ID に関連付けられている場合、攻撃者にとってリクエストを偽造するのはさらに困難になります。

Yahoo が偽のクロスサイトリクエストに対処する方法は、.crumb と呼ばれるランダムな文字列をフォームに追加することです。Facebook にも同様の解決策があり、そのフォームには post_form_id と fb_dtsg が含まれることがよくあります。

ランダム文字列コードの実装

このアイデアに従い、crumb の実装をコピーします。コードは次のとおりです。

クラスクラム {

CONST SALT = "あなたの秘密の塩";

静的 $ttl = 7200;

静的パブリック関数チャレンジ($data) {

return hash_hmac('md5', $data, self::SALT);

}

静的パブリック関数 issueCrumb($uid, $action = -1) {

$i = ceil(time() / self::$ttl);

return substr(self::challenge($i . $action . $uid), -12, 10);

}

静的パブリック関数 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 はこのランダムな文字列の有効時間を表します。

応用例

フォームを構築中

非表示のランダムな文字列のパンくず

をフォームに挿入します

input type="submit">

フォームの処理デモ.php

クラムを確認してください

if(Crumb::verifyCrumb($uid, $_POST['crumb'])) {

//通常のプロセスに従ってフォームを処理します

} else {

//クラム検証に失敗しました。エラー プロンプト プロセス

}



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