我已经阅读了CSRF以及如何使用不可预测的同步器令牌模式来防止它 . 我不太明白它是如何工作的 .
我们来看看这个场景:
用户使用以下格式登录网站:
<form action="changePassword" method="POST">
<input type="text" name="password"><br>
<input type="hidden" name="token" value='asdjkldssdk22332nkadjf' >
</form>
服务器还将令牌存储在会话中 . 发送请求时,它会将表单数据中的标记与会话中的标记进行比较 .
当黑客可以编写以下代码的JavaScript代码时,如何防止CSRF:
-
向网站发送GET请求
-
接收包含请求表单的html文本 .
-
在html文本中搜索CSRF令牌 .
-
使用该令牌发出恶意请求 .
我错过了什么?
2 回答
攻击者无法使用JavaScript从站点读取令牌,因为它将是一个跨源请求,并且相同原始策略(MDN,W3C)阻止(默认情况下)对其中的数据的访问 .
以此为例:
JS控制台报告:
恶意服务器使用与目标服务器的会话来伪造请求 . 那么#1是如何发生的?两个选项:您可以从恶意服务器发出#1请求,但这只会返回服务器会话的CSRF令牌,或者您可以使用AJAX发出#1请求,正如您正确识别的那样,它将返回CSRF令牌受害者用户
由于这个原因,浏览器已经实现了HTTP访问控制 . 您必须使用
Access-Control-Allow-Origin
标头来限制哪些域可以向您的服务器发出AJAX请求 . 换句话说,您的服务器将确保浏览器无法读取此事件,因为默认情况下服务器不会发送Access-Control-Allow-Origin
标头,除非配置为执行此操作 . 如果您确实需要允许AJAX请求,您必须信任标头中的任何来源不执行CSRF攻击,您可以选择性地锁定应用程序的敏感部分以不允许AJAX请求,或使用其他Access-Control-*
标头来保护自己 .https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet
你应该阅读Cross-Origin Resource Sharing(CORS) .