4

Rails を使用したことはありませんが (これは私の質問にしか答えられませんでした)、フォームを含む各ページに CSRF トークンが配置されていることがわかります。
私が理解していないのは、そのために2つのmetaタグを使用する理由です:

<meta name="csrf-token" content="<%= form_authenticity_token %>" />
<meta name="csrf-param" content="authenticity_token" />

csrf-token メタだけではないのはなぜですか?

<meta name="csrf-token" content="<%= form_authenticity_token %>" />

の用途はcsrf-param何ですか?

4

2 に答える 2

6

Rails では、CSRF トークンに関連するフードの下で多くの構成を行うことができます。必要に応じてパラメーターの名前を変更できますが、その場合、jQuery UJS ドライバーは新しいパラメーターの名前を認識する必要があります (Ajax 要求で使用されるため)。そのため、ここには 2 つのメタ パラメータがあります。1 つ目は明らかに実際の認証トークンですが、2 つ目は Rails の JavaScript ドライバが最初のパラメータの名前を知るために必要です。(これは、 jQuery ドライバーまたはPrototype ドライバーで実際に確認できます。)

これにより、ある種のクレイジーなループに陥ると主張することもできます。メタ タグの名前csrf-paramを別のメタ タグに変更できないのはなぜでしょうか。これは、多くの手動オーバーライドを必要とせずに、Rails が既存の CSRF ソリューションを簡単に採用できるようにするために行われたと思います。また、アプリの将来性をわずかに保証することもできます。HTML5 標準が CSRF トークンの公式タグを採用し、Rails が将来のバージョンでデフォルトの CSRF タグを変更することを選択した場合、JavaScript ドライバーをまったく変更する必要はありません。

最終的に、これが存在する本当の理由に最も近いと思います: CSRF システムの将来の変更に対する保険であり、今後の不必要でおそらく非常に迷惑な非推奨を防ぎます。

于 2012-08-30T15:22:23.400 に答える
2

csrf-param にはパラメーターの名前が含まれ、csrf-token はパラメーターの値です。したがって、フォームは次のようになります。

<form action="/" method="post">
  <input type="hidden" name="authenticity_token" value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjkGTfMTVi
  MGYwMGEwOA==">
  …
  </form>
于 2012-08-30T14:43:08.717 に答える