パート1
GET パラメータ、POST データ、またはリクエスト ヘッダーを介して認証トークンを渡す場合、まったく違いはありません (Rails では POST/GET パラメータは実質的に同じです)。
コードを見てみましょう (私が今まで見た中で最高のコードではありませんが...)
def verified_request?
!protect_against_forgery? || request.get? || request.head? ||
form_authenticity_token == params[request_forgery_protection_token] ||
form_authenticity_token == request.headers['X-CSRF-Token']
end
リクエストが有効な場合 (次のいずれか)
protect_against_forgery?
偽です
- リクエストはGET
- リクエストはHEADです
- params のトークンは、セッションに保存されているものと同じです
- ヘッダー内のトークンは、セッションに保存されているものと同じです
トークンはリクエストごとに生成され、後で検査するためにセッションに保存されることを追加する必要があります (後続のリクエストが POST/PUT/PATCH/DELETE の場合)
したがって、認証トークンを渡す両方の方法が有効です。
パート2
AJAXで生の認証トークンを渡すのは危険ですか? いいえ、フォームで渡すことはまったく危険ではありません。さらに説明するために、別のSOの質問で優れた回答を引用します
原因: 認証トークンはセッションに保存されるため、クライアントはその値を知ることができません。これにより、Rails アプリ内でフォームを表示せずにフォームを Rails アプリに送信することができなくなります。サービス A を使用していて、サービスにログインしていて、すべて問題ないと想像してください。ここで、サービス B を利用していて、気に入った写真を見つけて、その写真を押して拡大表示したとします。ここで、サービス B に悪意のあるコードがあった場合、サービス A (ログインしている) にリクエストを送信し、 http://serviceA.com/close_accountにリクエストを送信してアカウントを削除するように要求する可能性があります
。これは、CSRF (クロス サイト リクエスト フォージェリ) として知られているものです。
元の回答: https://stackoverflow.com/a/1571900/2422778
私が書いたものはすべてRailsガイドとStack Overflowの両方で非常によく説明されているので、私はまだこの質問をあなたの怠惰/忍耐の欠如と考えています. 次回は、ここに投稿する前に、もっと粘り強く答えを探してください。
とにかくお役に立てて光栄です。