令牌如何防止csrf攻击?

dav*_*vid 26 javascript security csrf csrf-protection

我已经阅读了CSRF以及如何使用不可预测的同步器令牌模式来防止它.我不太明白它是如何工作的.

我们来看看这个场景:

用户使用以下格式登录网站:

<form action="changePassword" method="POST">
   <input type="text" name="password"><br>
   <input type="hidden" name="token" value='asdjkldssdk22332nkadjf' >
</form>
Run Code Online (Sandbox Code Playgroud)

服务器还将令牌存储在会话中.发送请求时,它会将表单数据中的标记与会话中的标记进行比较.

当黑客可以编写以下代码的JavaScript代码时,如何防止CSRF:

  1. 向网站发送GET请求
  2. 接收包含请求表单的html文本.
  3. 在html文本中搜索CSRF令牌.
  4. 使用该令牌发出恶意请求.

我错过了什么?

Que*_*tin 15

攻击者无法使用JavaScript从站点读取令牌,因为它将是跨源请求,并且相同原始策略(MDN,W3C)会阻止(默认情况下)对其中的数据的访问.

以此为例:

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

JS控制台报告:

XMLHttpRequest无法加载http://google.com/.Access-Control-Allow-Origin请求的资源上没有" 标题".