CSRFと、それを防ぐために予測不可能なシンクロナイザートークンパターンがどのように使用されるかについて読みました。私はそれがどのように機能するのかよく理解していませんでした。
このシナリオを考えてみましょう:
ユーザーは次のフォームでサイトにログインします:
<form action="changePassword" method="POST">
<input type="text" name="password"><br>
<input type="hidden" name="token" value='asdjkldssdk22332nkadjf' >
</form>
サーバーは、トークンをセッションに保存します。リクエストが送信されると、フォームデータのトークンとセッションのトークンが比較されます。
ハッカーが次のようなJavaScriptコードを記述できる場合、CSRFをどのように防ぐことができますか。
何かが足りませんか?
攻撃者は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
」ヘッダーがありません。