我已经阅读了CSRF以及如何使用不可预测的同步器令牌模式来防止它。我不太明白它是如何运作的。
让我们来看看这个场景:
用户使用以下格式登录网站:
<form action="changePassword" method="POST">
<input type="text" name="password"><br>
<input type="hidden" name="token" value='asdjkldssdk22332nkadjf' >
</form>
服务器还将令牌存储在会话中。发送请求时,它会将表单数据中的标记与会话中的标记进行比较。
当黑客可以编写以下代码的JavaScript代码时,如何阻止CSRF:
我错过了什么?
答案 0 :(得分:13)
攻击者无法使用JavaScript从站点读取令牌,因为它将是一个跨源请求,并且默认情况下会阻止对其中的数据的访问(同源策略){{{ 3}},MDN)。
以此为例:
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://google.com");
xhr.addEventListener('load', function (ev) {
console.log(this.responseText);
});
xhr.send();
&#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)。