13

現在、CSRFクロスサイトリクエストフォージェリを防ぐためにフォームにトークンを生成しています。次のようになります。

<form method="post" action="action.php">
   <input type="hidden" id="security_token" name="security_token" value="gTt96phAcretR99rafEjepHebrEZadEdezadagaZ3gAS5es33WReJeZaMADU2AWr" />
   ...
</form>

問題は、1つのページに複数のフォームがあることです。フォームごとにセキュリティトークンを作成する必要があるので、、、security_token_1またはフォーム内でセキュリティトークンを生成する代わりに、次のようにタグsecurity_token_2全体のプロパティに追加できます。body

<body data-csrf-token="gTt96phAcretR99rafEjepHebrEZadEdezadagaZ3gAS5es33WReJeZaMADU2AWr">
...
</body>

これはどういうわけか安全ではありませんか?複数のセキュリティトークンを処理する代わりに、セキュリティトークンをbody要素に追加するだけでよいため、作業が大幅に簡素化されます。

洞察とコメントをありがとう。

4

2 に答える 2

16

両方のフォームで同じ生成トークンを使用できない理由は実際にはありません。各フォームの各非表示フィールドは同じname属性を持っています。

結局のところ、実際に検証しようとしているのは、有効なセッションを持つユーザーからフォームリクエストが受信され、一度に1つのフォームのみがアクティブに投稿されるということです。したがって、投稿されたトークンを、ユーザーのセッションに保存されたトークンと比較しています。これを行うために、複数のトークン値が存在する必要はありません。

AJAX投稿に基づいてトークンを更新する必要がある場合は、言うように、新しく作成されたトークンをAJAX応答に戻し、非表示フィールドの値を新しいトークン値に更新する必要があります。

于 2013-02-05T19:30:30.637 に答える
3

攻撃者がCSRFトークンを取得できないことを確認する限り(たとえば、サードパーティに送信されるフォームに含まないようにする)、単一のCSRFトークンを使用しても問題ありません。「本文に入れる」メソッドでは、フォームを送信するためにJavaScriptが必要になるため、中央のトークンを1つだけ使用する場合でも、すべてのフォームに挿入することをお勧めします。

OWASPガイドには次のように書かれています。

一般に、開発者は現在のセッションでこのトークンを1回だけ生成する必要があります。このトークンの最初の生成後、値はセッションに保存され、セッションが期限切れになるまで後続の各リクエストに使用されます。

つまり、複数のトークンを使用する必要はまったくありません。

個別のトークンを使用することには、なんとかしてすべてではなく一部を侵害した場合(たとえば、XSSがすべてを侵害するため)、攻撃者の選択肢が制限されるという利点があります。

于 2013-02-05T19:31:25.070 に答える