web-dev-qa-db-ja.com

トークンはcsrf攻撃を防ぐ方法を教えてください。

CSRFと、それを防ぐために予測不可能なシンクロナイザートークンパターンがどのように使用されるかについて読みました。私はそれがどのように機能するのかよく理解していませんでした。

このシナリオを考えてみましょう:

ユーザーは次のフォームでサイトにログインします:

<form action="changePassword" method="POST">
   <input type="text" name="password"><br>
   <input type="hidden" name="token" value='asdjkldssdk22332nkadjf' >
</form>

サーバーは、トークンをセッションに保存します。リクエストが送信されると、フォームデータのトークンとセッションのトークンが比較されます。

ハッカーが次のようなJavaScriptコードを記述できる場合、CSRFをどのように防ぐことができますか。

  1. サイトにGETリクエストを送信します
  2. リクエストフォームを含むhtmlテキストを受け取ります。
  3. HTMLテキストでCSRFトークンを検索します。
  4. そのトークンを使用して悪意のある要求を行います。

何かが足りませんか?

26
david

攻撃者はJavaScriptを使用してサイトからトークンを読み取ることはできません。これは、クロスオリジンリクエストであり、そこからのデータへのアクセスが同一生成元ポリシーによって(デフォルトで)ブロックされるためです( [〜# 〜] mdn [〜#〜]W3C )。

これを例にとってみましょう:

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://google.com");
xhr.addEventListener('load', function (ev) {
    console.log(this.responseText);  
});
xhr.send();

JSコンソールのレポート:

XMLHttpRequestはhttp://google.com/をロードできません。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。

15
Quentin