繁体   English   中英

令牌如何防止csrf攻击?

[英]How to does the token prevent csrf attack?

我已经阅读了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. 使用该令牌发出恶意请求。

我错过了什么?

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

以此为例:

 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 ”标头。

重要的是要意识到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

您应该阅读跨源资源共享 (CORS)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM