为什么 XSS 的防御,很多人要用前后端 转码、过滤、报错 的方法,直接在前端当做文本显示不香吗?

2020-04-24 17:59:42 +08:00
 moonlord

比如就有人问 XSS 防御,一堆的人说 “转码、过滤、报错”
根本睁着眼,都看不见 V2EX 的输入框就是输入啥,显示啥,毛的转码过滤报错。。。

防止 xss 和 sql 注入而进行非法字符过滤,js 前端有什么几乎一劳永逸的方式?
https://www.v2ex.com/t/665687?p=1#r_8874716

V2EX 的留言接口
https://www.v2ex.com/api/replies/show.json?topic_id=665687

6861 次点击
所在节点    JavaScript
36 条回复
hshpy
2020-04-25 09:32:49 +08:00
@hshpy 改下,DOM 型 XSS 是前端的事但不是过滤,过滤反射型存储型要后端做。
codehz
2020-04-25 09:43:21 +08:00
@hshpy (不应该存 html,可以存另一个结构化的表示,然后前端再重新处理回 dom 结构,全程不需要 innerHTML
gamexg
2020-04-25 10:08:39 +08:00
我没理解你的意思?


>都看不见 V2EX 的输入框就是输入啥,显示啥,毛的转码过滤报错


回复文本框输入的 <html> ,实际后端输出时已经转码为了 &lt;html&gt; ,你可以搜索下本贴的源码,就能看到源码里面并没有 <html>,而是被转码为了 &lt;html&gt; 。


json 也是如此, " 会被转码为 \" 。你可以搜索下你提供的那个 留言接口里面,可以找到类似下面的字符串。

<a target=\"_blank\" href=\"https
gamexg
2020-04-25 10:11:35 +08:00
@gamexg #23 的确过滤、报错是个大坑,除了敏感词,不然不建议搞出来过滤、报错。
hshpy
2020-04-25 11:38:12 +08:00
@codehz 用户返回数据都是后端拼接的 html 页面,只能由后端清理数据。攻击者可以绕过前端清理数据的 js 。后端获取用户 IP,攻击者在请求头注入,还是得由后端处理。
codehz
2020-04-25 12:14:07 +08:00
@hshpy (所以问题就在这里了,按拼接 html 的模式就没法解决了,要解决就只能通过让后端输出结构化数据,前端做转换才可以(
hshpy
2020-04-25 13:47:28 +08:00
@codehz 前端还要多请求几次数据,只要页面有 js 操作就有可能出现 DOM 型 XSS.
纯静态它不香吗。。。
lscho
2020-04-25 13:58:16 +08:00
如果只是 xss,那纯前端确实可以解决。。但是能出现 xss 的地方一般都需要防注入,所以实际操作中都是后台顺便处理了。
lscho
2020-04-25 14:00:20 +08:00
而且前面答主说了,xss 不止有 dom 型,还有反射型和存储型,这些不表现在 dom 结构内,这些必须要后台处理的。
chinvo
2020-04-25 14:26:43 +08:00
对纯文本, 自然是 innerText

对富文本, 可以用 bbcode 或者 markdown, 关闭 html 标签支持
dengjscn
2020-04-25 14:29:13 +08:00
@chinvo markdown ??前端的东西最终还得是 HTML
chinvo
2020-04-25 15:14:43 +08:00
@dengjscn #31 前端渲染啊,禁用渲染器的 HTML 支持

当然这个的可靠性是建立在 markd.js 之类的前端渲染器能正确过滤 HTML 标签的前提下
shenqi
2020-04-25 15:20:49 +08:00
不是不行,也可以。
codehz
2020-04-25 15:26:41 +08:00
@hshpy google 的做法是渲染到 script 块里,也不需要额外请求
iyangyuan
2020-04-26 10:08:35 +08:00
http only
SYM01
2020-05-18 11:52:09 +08:00
如果是富文本数据,可以在输出的时候做一次 HTML 白名单过滤。

- 提供开箱即用的默认白名单( Go ): https://github.com/SYM01/htmlsanitizer
- 一个广泛使用的富文本过滤器( Go ): https://github.com/microcosm-cc/bluemonday

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665769

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX