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

SpringSecurity 前后端分离的情况下,如何防止 CSRF 攻击?

  •  
  •   movq · 2022-10-29 19:25:57 +08:00 · 2420 次点击
    这是一个创建于 542 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在这里看到的一个解决办法是说,后端把 csrf token 放到 cookie 里面传给前端,前端从里面提取出来 csrf token, 然后把它放到 HTTP 请求头里面。

    文章里面说,CSRF 攻击者只能拿到 cookie ,但不知道里面是什么内容,所以他不会为假请求添加 http header

    但问题是 cookie 是明文保存的,他看到你 cookie 里面有 csrf token ,那么把你 cookie 里面的 csrf token 提取出来,在假请求里面也加上 csrf token header 不就行了吗?

    qaYMVlEPI9SixQT

    11 条回复    2022-10-30 01:46:44 +08:00
    edis0n0
        1
    edis0n0  
       2022-10-29 20:34:52 +08:00
    能不能先动动手查查 CSRF 是什么意思,为什么会导致 CSRF 攻击? CSRF 攻击的时候浏览器会像正常请求一样自动附带上对应域名的所有 cookies ,但攻击者获取不到具体内容,自然无法给你一并加进请求头。
    movq
        2
    movq  
    OP
       2022-10-29 20:42:11 +08:00
    @edis0n0 spring security 里面后端是先用 CookieCsrfTokenRepository.withHttpOnlyFalse()这个东西把传到前端的 cookie 变成了可以用 js 代码读入。攻击者完全可以用 JS 代码读到里面的内容
    edis0n0
        3
    edis0n0  
       2022-10-29 20:45:58 +08:00
    @movq #2 CSRF 不是 XSS ,攻击者无法向网页注入 JS ,自然也无法读取目标页 cookies
    movq
        4
    movq  
    OP
       2022-10-29 20:51:17 +08:00
    @edis0n0 所以你的意思就是说,「在 XSS 不存在的情况下,0 楼说的防止 CSRF 攻击的方法是安全的」咯,那你有必要预设我不知道 CSRF 啥意思吗
    momocraft
        5
    momocraft  
       2022-10-29 20:56:28 +08:00
    攻击者可以用自己的 ua 做 没法用别人的浏览器做
    Ptu2sha
        6
    Ptu2sha  
       2022-10-29 21:47:30 +08:00
    认真看 CSRF 是什么意思啊! CS 是你访问恶意站点 这个站点执行你已经登录的正常网站的 AJAX 请求 冒充你的操作
    比如你在 wb 点击关注 那么会发出 ajax 请求执行你关注的操作 这个是正常的
    而你访问恶意网站 上面自动执行了请求 给你关注用户 在你不知情的情况下关注了别人
    早期浏览器的 ajax 请求是自动带上 cookie 并不是恶意网站的 js 获取到了你的 cookie
    lisongeee
        7
    lisongeee  
       2022-10-29 22:04:23 +08:00
    > 他看到你 cookie 里面有 csrf token

    攻击者看不到,他只能向你的网站发起请求,但是浏览器会帮他带上 cookie ,并且如果你的网站不支持跨域,他只能发出去无法收到

    现代浏览器里,网站可以设置 `SameSite=Strict` ,这样 浏览器就不会帮攻击者带上 cookie ,你的网站只能收到一个没有 cookie 的请求
    polarbear007
        8
    polarbear007  
       2022-10-29 22:27:05 +08:00
    1 ,前面大佬已经提过,第三方的恶意站点无法跨域通过 js 获取后台发放的 cookie 信息。(这是浏览器的同源策略限制的,就算你把 cookie 的 http-only 属性关闭)
    2 ,其实这个 csrf 参数完全可以做到前端无感,也就说不需要关闭 http-only 属性,前端也不需要知道 cookie 中带有 csrf 参数。 因为 cookie 机制本来就是发请求的时候(可以是普通的表单提交,也可以是 ajax 请求),自动携带给后台。你可以在后台自动过滤特定敏感接口,是否消费 cookie 中携带的 csrf 参数,并生成新的参数。(其实让前端在敏感接口带个特定标识,告诉后台要额外校验 cookie 中的 csrf 参数即可)
    totoro52
        9
    totoro52  
       2022-10-29 23:08:31 +08:00
    csrf-token 怎么可能被提取到,那就不是 csrf 了是 xss 了,能注入 xss 的话 csrf 已经不重要了
    mmdsun
        10
    mmdsun  
       2022-10-29 23:51:53 +08:00
    官网演示的是 spring-security + angular-js, 其他前后分离也可以参考
    https://spring.io/guides/tutorials/spring-security-and-angular-js/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4036 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:25 · PVG 13:25 · LAX 22:25 · JFK 01:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.