V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yodhcn
V2EX  ›  程序员

有 CORS 还需要 CSRF token 吗?

  •  
  •   yodhcn ·
    yodhcn · 144 天前 via Android · 2426 次点击
    这是一个创建于 144 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在现代浏览器环境,要防范 CSRF ,检查 origin 头就足够了吧?还需要 CSRF token 吗?

    第 1 条附言  ·  143 天前
    https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html

    禁止简单请求¶
    当<form>使用标签提交数据时,它会发送浏览器未指定为“需要预检”的“简单”请求<form>。这些“简单”请求会带来 CSRF 风险,因为浏览器允许将它们发送到任何来源。
    第 2 条附言  ·  143 天前
    总结,csrf 的防范是必要的,但不一定通过 csrf token ,还可以通过禁止“简单请求”来保证遵守同源策略,比如 hono.js 自带的 csrf 插件就是这样做的

    https://github.com/honojs/hono/blob/75c314c279f956f09948e61765a386bc4a7c3d5e/src/middleware/csrf/index.ts#L56

    此外,具有自定义标头的请求会自动遵守同源策略
    https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#custom-headers-and-cors
    10 条回复    2024-07-04 12:28:52 +08:00
    GeekGao
        1
    GeekGao  
       144 天前
    首先要明确 CSRF token 的定义:它是一个在服务器端生成并在客户端(通常是通过 HTTP cookie 或 HTML 表单)携带的随机值。当服务器接收到一个请求时,它会检查请求中的 token 是否与服务器保存的 token 匹配。由于这个 token 是在用户登录时生成的,攻击者无法预知其值,因此无法构造有效的 CSRF 攻击

    其次要知道 Origin 头是可以被篡改的,而且还有非浏览器环境是可以不遵守同样的 Origin 头规则。

    结论,就是依然有必要。
    keakon
        2
    keakon  
       144 天前   ❤️ 1
    这 2 者作用不一样啊,CORS 是跨域的安全设置,你没跨域使用 xhr 、fetch 时不受影响。
    yodhcn
        3
    yodhcn  
    OP
       144 天前 via Android
    @GeekGao 但是,非浏览器环境 CSRF token 也同样没用啊?可以通过请求直接拿到 CSRF token 与 cookie
    GeekGao
        4
    GeekGao  
       144 天前
    @yodhcn 怎么没用,为何一定用 cookie ? 选择使用其他方式来传递 CSRF 令牌啊:HTTP Header 、URL 参数、Request Body
    wonderfulcxm
        5
    wonderfulcxm  
       143 天前 via iPhone
    @yodhcn csrf 不是防模拟提交的
    zjsxwc
        6
    zjsxwc  
       143 天前
    GPT:在不跨域且 CORS 限制有效的情况下,如果网站本身存在 XSS (跨站脚本)漏洞,攻击者就有可能利用这个漏洞来注入恶意脚本,从而在合法的页面中执行恶意操作。
    例如,如果网站的某个输入框没有对用户输入的内容进行充分的过滤和验证,攻击者可以在输入框中提交一段恶意的 JavaScript 代码。当其他用户访问包含这个输入内容的页面时,浏览器会执行这段恶意代码,从而实现诸如窃取用户会话信息、篡改页面内容、发送非法请求等恶意行为。
    所以,即使在同一域名下,如果存在 XSS 漏洞,只要 CORS ,不做 CSRF 防护也可能被攻击。
    AloneHero
        7
    AloneHero  
       143 天前 via Android
    楼上是不是没明白楼主的问题,明显楼主想问只依靠 CORS 机制加检查 origin 的情况下能否防得住 CSRF 。结果不明所以的乱答一堆,然后没由来的得出一个结论。。。
    hugepizza
        8
    hugepizza  
       143 天前
    不一定要 CSRF token, CSRF 本意就是跨站请求攻击,都不允许跨站了还怎么跨站攻击
    至于非浏览器环境怎么样 那就不是防 CSRF 的讨论范围了 honojs 那个本质就是过滤 origin
    accelerator1
        9
    accelerator1  
       143 天前
    CSRF (跨站点请求伪造)能实施主要依靠两点,1:请求参数可预测,2:身份鉴权信息自动携带。
    第 1 点的防范主要靠表单中添加服务端生成的随机参数,第 2 点主要靠 cookie 的自动发送实现,防范手段就是将认证信息由 cookie 传输改为 header 传输,header 只能代码添加到请求中。

    CORS (跨源资源共享),用于跳过浏览器对跨域请求的限制。

    两者有什么关联关系。
    wtfedc
        10
    wtfedc  
       143 天前
    没有其他 xss 漏洞的情况下,其实同源策略是可以预防 CSRF 的。在 xss 漏洞存在的情况下,你在 malicious.site 加载一个 iframe 访问 normal.site ,脚本拿 cookie 构造请求,这种情况下,如果有 CSRF Token ,是可以预防的。

    常规做法就是 CSRF Token + samesite cookie 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2657 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 70ms · UTC 05:03 · PVG 13:03 · LAX 21:03 · JFK 00:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.