私はアプリケーション (たまたま Django) を作成していますが、"CSRF トークン" が実際に何であるか、そしてそれがどのようにデータを保護するかを知りたいだけです。
CSRF トークンを使用しない場合、投稿データは安全ではないのでしょうか?
ベストアンサー1
クロスサイトリクエストフォージェリ(CSRF)を簡単に説明すると
- 現在、オンラインバンキングにログインしていると仮定します。
www.mybank.com
- からの送金により、
mybank.com
(概念的には)形式のリクエストが発生すると想定しますhttp://www.mybank.com/transfer?to=<SomeAccountnumber>;amount=<SomeAmount>
。(口座番号はログイン時に暗示されるため、必要ありません。) www.cute-cat-pictures.org
悪質なサイトだとは知らずにアクセスしてしまいます。- そのサイトの所有者が上記のリクエストの形式を知っていて(簡単!)、あなたがログインしていることを正しく推測した場合(運が必要です!)、彼らは自分のページに(はケイマン諸島のアカウント番号で、 はあなたが以前持っていてよかったと思っていた金額です)
mybank.com
のようなリクエストを含めることができます。http://www.mybank.com/transfer?to=123456;amount=10000
123456
10000
- そのページを取得したので
www.cute-cat-pictures.org
、ブラウザがそのリクエストを実行します。 - 銀行はこのリクエストの送信元を認識できません。Web ブラウザはリクエストを Cookie とともに送信し
www.mybank.com
、完全に正当なものに見えます。あなたのお金が消えてしまいます。
これはCSRF トークンのない世界です。
次はCSRFトークンを使ったより良い方法です:
- 転送要求は 3 番目の引数で拡張されます:
http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971
。 - このトークンは、推測不可能な巨大な乱数であり、
mybank.com
Web サイトにそのページが表示されるときにそのページ上に表示されます。どのページを誰に提供する場合でも、そのたびに異なります。 - 攻撃者はトークンを推測できず、Web ブラウザにトークンを引き渡すよう説得することもできません (ブラウザが正常に動作している場合)。そのため、間違ったトークン (またはトークンなし) を含むリクエストは によって拒否されるため、攻撃者は有効なリクエストを作成できません
www.mybank.com
。
結果:10000
通貨単位は保持されます。
(あなたのマイレージは異なる場合があります。)
編集元一読の価値があるコメントによるソフェ:
www.cute-cat-pictures.org
HTTP アクセス制御のため、 のスクリプトは通常、 の CSRF 対策トークンにアクセスできないことに注意してください。この注意事項は、別の Web サイトから API を使用できないという理由だけで、目的を知らずにすべての Web サイト応答のwww.mybank.com
ヘッダーを不当に送信する一部の人にとって重要です。Access-Control-Allow-Origin: *