web-dev-qa-db-ja.com

csrfトークンの配置

私はcsrfトークンを配置する場所が複数あることを知っています。最も一般的な場所は、フォームの非表示の入力フィールドに配置することです。 2つ目は、httpOnlyフラグが設定されたCookieです。私が知りたいのは、データを変更するためにpostリクエストが行われるたびに使用できるように、それをjavascript変数に配置することに反対があることです。

それ以外の場合は、フォームごとにフォームの非表示フィールドに配置する必要があり、フォームが動的に生成されると問題が発生する可能性があります。

2
Nathan

JavaScriptを介してフォームにCSRFトークンを動的に追加できます。ただし、いくつかの問題に注意する必要があります。

  • クロスドメインフォームがある場合は、JavaScriptコードがCSRFトークンを追加しないように注意する必要があります。これは、トークンをリークするためです。
  • アプリケーションでフォームを作成するために最高レベルの特権を持たないユーザーが必要な場合、トークンが自動的に追加されるため、ユーザーはCSRF攻撃を実行できます。
  • HTMLインジェクションはフォームのインジェクションを介してCSRFにつながり、HTMLインジェクションの影響を少し増やします。同様に、一部のユーザーにHTMLのサブセットを許可し、フィルターにフォームの作成を許可する脆弱性がある場合、CSRFに対して脆弱になります。

無関係:CSRFトークンは常に2つの場所にある必要があります。最も一般的なアプローチは、それらをセッション内のサーバー側に格納し、さらに別の場所に格納することです(たとえば、フォームで送信するなど)。それはあなたがあなたの質問で言及しているもののようです。このアプローチでは、トークンをフォームではなくCookieに保存することはできません(常に送信され、サーバー側のトークンに対して検証されます)。トークンをサーバー側に格納する代わりに、Cookieにトークンを格納することになります。あなたはまだそれを例えばフォーム経由で提出する必要があります。

3
tim