【问题标题】:CSRF using AJAX. Why is it possible?CSRF 使用 AJAX。为什么有可能?
【发布时间】:2020-08-21 15:32:25
【问题描述】:

重现步骤:

  1. 转到https://stackoverflow.com/
  2. 在您的网络浏览器中打开开发者控制台
  3. 执行以下JS代码:

    fetch(`https://webhook.site/5a6f8001-3646-4b3e-bd76-a4562af5a9ef`, { credentials: 'include' })
    
  4. 转到https://webhook.site/#!/5a6f8001-3646-4b3e-bd76-a4562af5a9ef

您应该会在https://webhook.site 上看到 HTTP 请求

为什么 HTTP 请求会到达服务器? 这是否违反同源政策?

【问题讨论】:

  • 你的意思是 CORS 而不是 CSRF?当 cookie 被用作身份验证机制时,CSRF 更像是一种保护。如果您确实是指 CORS,我猜 webhook.site 只是允许任何来源?见developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
  • @sp00m 不,我的意思是 CSRF 攻击 en.wikipedia.org/wiki/Cross-site_request_forgery
  • 当我尝试你的 sn-p 仅供参考时,我确实有 CORS 阻止了我的请求,来源 https://stackoverflow.com 不允许。
  • @sp00m 现在检查这个 webhook.site/#!/5a6f8001-3646-4b3e-bd76-a4562af5a9ef 。你看到你的请求了吗?
  • 有趣的是,虽然请求因为CORS被浏览器取消了,但看起来请求确实到达了服务器。我本来预计该请求甚至不会到达服务器。令人惊讶的是,我会等待更聪明的大脑来解决这个问题:)

标签: ajax security csrf same-origin-policy websecurity


【解决方案1】:

首先,不要混用 SOP、CORS 和 CSRF。

  1. SOP(同源策略)检查由浏览器执行,有助于保护您的源中从“其他”访问的资源起源。如果需要允许他们读取您的内容,您需要定义规则以扩展到称为CORS的限制。

  2. CSRF(跨站点请求伪造)是一种通过受害者的 cookie 帮助创建或发送恶意无效请求的攻击。使用受害者的 cookie 到达目标源后的每个请求都将通过该用户的权限执行。因此,攻击者不会读取响应。此外,由于 Same Origin Policy 规则,您无法读取响应,除非它们不允许使用 CORS 规则读取其内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    相关资源
    最近更新 更多