令牌如何防止csrf攻击?

时间:2015-07-09 16:36:32

标签: 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>

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

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

  1. 向网站发送GET请求
  2. 接收包含请求表单的HTML文本。
  3. 在html文本中搜索CSRF令牌。
  4. 使用该令牌发出恶意请求。
  5. 我错过了什么?

2 个答案:

答案 0 :(得分:13)

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

以此为例:

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

JS控制台报告:

  

XMLHttpRequest无法加载http://google.com/。不,Access-Control-Allow-Origin&#39;标头出现在请求的资源上。

答案 1 :(得分:-2)

重要的是要意识到CSRF攻击只发生在浏览器中。恶意服务器使用用户与目标服务器的会话来伪造请求。那么#1是如何发生的?两个选项:您可以从恶意服务器发出#1请求,但这只会为服务器的会话返回一个CSRF令牌,或者您可以使用AJAX发出#1请求,正如您正确的那样已识别,将返回受害用户的CSRF令牌。

由于这个原因,浏览器实现了HTTP访问控制。您必须使用Access-Control-Allow-Origin标头来限制哪些域可以向您的服务器发出AJAX请求。换句话说,您的服务器将确保浏览器不会让恶意站点执行#1。不幸的是,我在这个问题上阅读的文件并不是很清楚,但我认为这是因为默认情况下服务器不会发送Access-Control-Allow-Origin标头,除非配置这样做。如果确实需要允许AJAX请求,则必须信任标头中的任何来源不执行CSRF攻击,您可以选择性地锁定应用程序的敏感部分以不允许AJAX请求,或使用另一个Access-Control-*标题来保护自己。

  

使用同步器令牌是应用程序可以依赖的一种方式   同源政策通过保密来防止CSRF   令牌以验证请求

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

您应该阅读Cross-Origin Resource Sharing(CORS)。