我在这里看到的一个解决办法是说,后端把 csrf token 放到 cookie 里面传给前端,前端从里面提取出来 csrf token, 然后把它放到 HTTP 请求头里面。
文章里面说,CSRF 攻击者只能拿到 cookie ,但不知道里面是什么内容,所以他不会为假请求添加 http header
但问题是 cookie 是明文保存的,他看到你 cookie 里面有 csrf token ,那么把你 cookie 里面的 csrf token 提取出来,在假请求里面也加上 csrf token header 不就行了吗?
1
edis0n0 2022-10-29 20:34:52 +08:00
能不能先动动手查查 CSRF 是什么意思,为什么会导致 CSRF 攻击? CSRF 攻击的时候浏览器会像正常请求一样自动附带上对应域名的所有 cookies ,但攻击者获取不到具体内容,自然无法给你一并加进请求头。
|
2
movq OP @edis0n0 spring security 里面后端是先用 CookieCsrfTokenRepository.withHttpOnlyFalse()这个东西把传到前端的 cookie 变成了可以用 js 代码读入。攻击者完全可以用 JS 代码读到里面的内容
|
4
movq OP @edis0n0 所以你的意思就是说,「在 XSS 不存在的情况下,0 楼说的防止 CSRF 攻击的方法是安全的」咯,那你有必要预设我不知道 CSRF 啥意思吗
|
5
momocraft 2022-10-29 20:56:28 +08:00
攻击者可以用自己的 ua 做 没法用别人的浏览器做
|
6
Ptu2sha 2022-10-29 21:47:30 +08:00
认真看 CSRF 是什么意思啊! CS 是你访问恶意站点 这个站点执行你已经登录的正常网站的 AJAX 请求 冒充你的操作
比如你在 wb 点击关注 那么会发出 ajax 请求执行你关注的操作 这个是正常的 而你访问恶意网站 上面自动执行了请求 给你关注用户 在你不知情的情况下关注了别人 早期浏览器的 ajax 请求是自动带上 cookie 并不是恶意网站的 js 获取到了你的 cookie |
7
lisongeee 2022-10-29 22:04:23 +08:00
> 他看到你 cookie 里面有 csrf token
攻击者看不到,他只能向你的网站发起请求,但是浏览器会帮他带上 cookie ,并且如果你的网站不支持跨域,他只能发出去无法收到 现代浏览器里,网站可以设置 `SameSite=Strict` ,这样 浏览器就不会帮攻击者带上 cookie ,你的网站只能收到一个没有 cookie 的请求 |
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 参数即可) |
9
totoro52 2022-10-29 23:08:31 +08:00
csrf-token 怎么可能被提取到,那就不是 csrf 了是 xss 了,能注入 xss 的话 csrf 已经不重要了
|
10
mmdsun 2022-10-29 23:51:53 +08:00
官网演示的是 spring-security + angular-js, 其他前后分离也可以参考
https://spring.io/guides/tutorials/spring-security-and-angular-js/ |
11
PMR 2022-10-30 01:46:44 +08:00 via Android
|