我读过关于CSRF的文章,以及如何使用不可预测的同步器令牌模式来防止它。我不太明白它是怎么工作的。
让我们来看看这个场景:
用户将使用以下表单登录到网站:
<form action="changePassword" method="POST">
<input type="text" name="password"><br>
<input type="hidden" name="token" value='asdjkldssdk22332nkadjf' >
</form>服务器还将令牌存储在会话中。发送请求时,它将表单数据中的令牌与会话中的令牌进行比较。
当黑客可以编写JavaScript代码时,如何防止CSRF:
是不是漏掉了什么?
发布于 2015-07-20 16:54:18
攻击者无法使用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”标头。
发布于 2015-07-09 17:35:28
重要的是要认识到CSRF攻击只发生在浏览器中。恶意服务器使用用户与目标服务器的会话来伪造请求。那么#1是如何发生的呢?有两个选项:您可以从恶意服务器发出#1请求,但这将简单地返回服务器会话的CSRF令牌,或者使用AJAX发出#1请求,正如您正确识别的那样,该请求将返回受害用户的CSRF令牌。
正是出于这个原因,浏览器实现了HTTP访问控制。您必须使用Access-Control-Allow-Origin头来限制哪些域可以向服务器发出AJAX请求。换句话说,您的服务器将确保浏览器不会让恶意站点执行#1。不幸的是,我所读到的关于这个问题的文档并不十分清楚,但我认为这是因为服务器默认不会发送Access-Control-Allow-Origin头,除非配置这样做。如果确实需要允许AJAX请求,则必须信任标头中的任何源而不执行CSRF攻击,可以选择性地锁定应用程序的敏感部分以不允许AJAX请求,或者使用其他Access-Control-*头来保护自己。
使用同步器令牌是应用程序可以依赖相同的原产地策略的一种方式,通过维护秘密令牌来验证请求,从而防止CSRF。
你应该阅读跨源资源共享 (CORS)。
https://stackoverflow.com/questions/31323416
复制相似问题