首页 文章

令牌如何防止csrf攻击?

提问于
浏览
23

我已经阅读了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 回答

  • 10

    攻击者无法使用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”标头 .

  • -2

    恶意服务器使用与目标服务器的会话来伪造请求 . 那么#1是如何发生的?两个选项:您可以从恶意服务器发出#1请求,但这只会返回服务器会话的CSRF令牌,或者您可以使用AJAX发出#1请求,正如您正确识别的那样,它将返回CSRF令牌受害者用户

    由于这个原因,浏览器已经实现了HTTP访问控制 . 您必须使用 Access-Control-Allow-Origin 标头来限制哪些域可以向您的服务器发出AJAX请求 . 换句话说,您的服务器将确保浏览器无法读取此事件,因为默认情况下服务器不会发送 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) .

相关问题