CSRFについて
まず、CSRFが実際に何であるかを明確にする必要があります。
クロスサイトリクエストフォージェリ は、Webサイトの悪用の一種であり、Webサイトが信頼するユーザーから不正なコマンドが送信されます。
次の例を考えてみましょう。ハッカーは、あなたがwww.example.comにアカウントを持っていることを知っており、それがあなたがログインしていて有効なセッションを実行しているWebサイトであるとしましょう。これで、ハッカーはあなたを別のWebサイト、たとえばtrustme.comを開くように誘惑することができます。このWebサイトに、次のコードを含む画像を投稿しました。
<img src="http://www.example.com/users/delete"/>
www.example.comのプログラマーが、単純なGETリクエストでそのURLを介してアカウントを削除することを実際に可能にし、ハッカーがその画像を表示して有効なCookieをロードするだけで、example.comのアカウントが削除されることを知っている場合、あなたはtrustme.comをサーフィンしているだけで、これら2つのサイトは互いに関係がないように見えましたが。
この例を要約すると、CSRFは、サイトがユーザーのブラウザーに対して持っている信頼、この場合はwww.example.comがブラウザーに対して持っている信頼を利用します。
あなたのケースにそのアナロジーを使用することは、ユーザーのブラウザであなたのサイトの信頼を利用することを意味します-しかし、ユーザーがあなたのフォームを見たときにまだログインしていないので、その信頼はまだ確立されていません。ただし、すでにログインしてそのフォームでページを再度読み込もうとすると、確立された信頼が悪用される可能性があるため、ユーザーがリダイレクトされることを確認する必要があります。
したがって、経験則として、ユーザーの検証要求にCookieとセッションを使用する場合、つまりユーザーの信頼を確認または確立する場合は常に、CSRF保護を使用してください。ユーザーがサインアップするときにユーザーの信頼を確立したいので、同じことが当てはまります。
残念ながら、CSRF攻撃はそれだけに限定されていません。私は起こり得る他の2つのことについて知りました(そしてそれは確かにそれに限定されません):
1 .:以下は、ログインフォームのCSRF保護を省略したことで可能になった、アカウントのスパイの気の利いた例です。
- ハッカーは、実際に信頼しているWebサイト(youtrustthis.com)にアカウントを作成します
- 彼は自分の資格情報を使用してブラウザからのログイン要求を偽造し、あなたをだまして自分のアカウントを使用させます
- あなたが実際に別のユーザーとしてyoutrustthis.comをサーフィンしていることに気付かない場合、攻撃者は後であなたが「彼に代わって」行ったことを確認します。
2 .: CSRF保護がない場合、ハッカーは自分のhtmlドキュメントでログインまたはサインアップフォームを模倣し、信頼できるサイトがリクエストに気付かずに何度も何度も送信できる(またはターミナルからcurlを使用して送信する)ことができます。実際にはそれ自体から取得されます。つまり、信頼されたドメインの実際のログインフォームは、ブラウザに表示されておらず、そこから送信されていません。これにより、彼はブルートフォース攻撃をはるかに簡単に実行できます。悪意のあるユーザーが資格情報の検索に成功した場合、サーバーは有効なセッションCookieで応答し、そのユーザーを信頼します。これにより、ユーザーはIDを盗みます。サインアップフォームの場合、彼は大量のアカウントにサインアップして、データベースにスパムを送信することができます。
これを要約すると、CSRF保護を使用します。悪意のあるユーザーは、セキュリティで保護されていないログインおよびサインアップフォームを使用して、サイトを悪用したり、ユーザーをスパイしたり、ユーザーのIDを盗んだりする可能性があります。
詳細については、この同様の質問(ログインフォーム用)およびこの学術論文も参照してください。後者には、3ページのログインCSRFに関する専用の章があります。また、このCSRF防止に関するチートシートも確認してください。
考えられる回避策について
CSRF保護では、セッションを使用してサーバー側で生成されたトークンとフォームから送信されたトークンを比較するため、これをクライアント側でのみ行う方法、つまりRailsスタックにアクセスしない方法は考えられません。重要なのは、クライアントがトークンを受け取るのは、サーバー側で生成された後だけであるということです。