アンチ CSRF トークンを使用して CSRF を防止する方法について学習しています。基本的に、アイデアは次のとおりです。
1) Md5 や Sha1 などのトークンを生成し、この値をセッション変数に保存します。
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
2) すべてのフォームは、POST 非表示フィールドにこのトークン値を含めます
<input type='hidden' name='token' value='$nonce_token' />
たとえば、ソースコードでユーザーにどのように見えるか:-
<input type='hidden' name='token' value='9ee66e4e63a06ee4b83a3edde4ecd587' />
3)フォームが送信されたら、POST隠しフィールドのトークン値がセッション値に保存されているトークンと一致することを確認します
if($_POST['token']==$_SESSION['token']){...ok...}
ただし、トークン値を非表示の POST フィールドに含めることにより、攻撃は単に Web サイトのソース コードを見てトークンを確認し、これを悪意のある生成された POST フォームに含めることができるため、このプロセスには少し欠陥があるようです。送信されたトークン値がセッション変数のトークン値と一致するため、受信すると成功します。これは、基本的に非表示フィールドのトークン値を攻撃者に表示するためです。
したがって、私の質問は、これを回避する最善の方法は何かということです.
1) 代わりに _GET を使用しますが、これにはまだ _POST のような欠陥があります
2) x 分後または各リクエスト後にトークン値を変更するが、ブラウザーに戻るときに使いやすさの問題が発生するか、ユーザーが入力しているフォームとトークン値が更新されたセッション トークン値と比較して古くなったときに失敗します。フォームへの記入。
3) 非表示の POST フォーム トークン値を暗号化してから、POST の送信時に復号化を試みますが、既にハッシュされた値の暗号化/復号化は複雑に思えます。
どんなアイデアでも大歓迎です。