XSS 过滤在什么时候做?

2015-04-26 18:40:06 +08:00
 bitinn
俗话说,validation在输入做,sanitization在输出做,但具体在输出到什么地方时做,各位有啥建议?

理论上是距离客户端越近的地方越好,但如果我想在服务器上跑过滤,有没自动化的库?
4937 次点击
所在节点    Node.js
11 条回复
lovedboy
2015-04-26 18:55:32 +08:00
渲染模版输出的时候做。
bitinn
2015-04-26 18:58:19 +08:00
@lovedboy 怎么知道哪些数据由用户生成,用schema检查整个object还是手动检查每个attribute?
MeirLin
2015-04-26 19:01:19 +08:00
最好输入输出都过滤,但是根据业务不同也应该有所取舍

推荐读一下 《白帽子讲Web安全》 这本书

在分享一份tips: http://www.fooying.com/chinese-translationthe-ultimate-xss-protection-cheatsheet-for-developers/

希望对你有所帮助
bitinn
2015-04-26 19:20:10 +08:00
@MeirLin 谢了,晚点看下。

你说的输入检测是validation吧。不知道输出成什么格式的话无法做filter啊。虽然很多时候都是html。

injection什么的就不是xss了,另外讨论。
vivisidea
2015-04-26 21:03:29 +08:00
在显示的时候做,谁显示谁负责~

XSS 过滤逻辑可能没 cover 到所有 case(或者后来可能会出现一些新的case)
这时候如果在存储之前做过滤,后来发现有些 case 没过滤掉咋办?回去数据库找没 cover 到的数据改掉?

如果在显示的时候做,只要改下显示逻辑即可,相对改数据库来说,简单很多吧
ca1n
2015-04-26 21:09:15 +08:00
@vivisidea 如果过滤函数好的话 输入的时候做比输出的时候做应该要省很多事 而且防xss的话也并不复杂吧 就我个人来说在输入的时候过滤的看的比较多
bitinn
2015-04-26 23:31:45 +08:00
@vivisidea 我们是前后端共用template(virtual dom),然后xss过滤不是一个同意的函数,而是针对不同使用情景设计的好几个API。

我想了很久,除了在template里直接写xss过滤外,没什么招。你不知道一个url是被用在attribute value还是html内容上,如果提前在后端过滤再输出JSON,就必须有两个url,一个为attribute过滤,一个为html内容过滤。这样template和data model都不好写。

当然我们也可以说,懒得这么复杂,统一xss过滤函数,过滤所有可能的场景,即便部分情况导致数据显示不正常也认了。这样就能统一过滤所有数据,不管用在哪里。
bitinn
2015-04-26 23:34:54 +08:00
作为参考,有种不同的过滤手段——

统一API
https://github.com/leizongmin/js-xss
分类API
https://github.com/yahoo/xss-filters

两者都是前后端均可,这样才能用到template里;大家在前后端JS还用什么库,欢迎推荐。
otokaze
2015-04-27 09:54:06 +08:00
居然是店长~快快合影,xxs我一般都在输出的时候用htmlspecialchars来完成格式化,一般不会出现问题
lincanbin
2015-04-27 11:07:15 +08:00
考虑性能可以在入库前做
jprovim
2015-04-27 13:44:39 +08:00
沒有什麼好的解法.

1. 前端提交過濾,
2. 後端返回過濾.
3. 存入DB之前過濾.

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

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

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

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

© 2021 V2EX