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

XSS 过滤在什么时候做?

  •  
  •   bitinn · 2015-04-26 18:40:06 +08:00 via iPhone · 4955 次点击
    这是一个创建于 3505 天前的主题,其中的信息可能已经有所发展或是发生改变。
    俗话说,validation在输入做,sanitization在输出做,但具体在输出到什么地方时做,各位有啥建议?

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

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

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

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

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

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

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

    如果在显示的时候做,只要改下显示逻辑即可,相对改数据库来说,简单很多吧
    ca1n
        6
    ca1n  
       2015-04-26 21:09:15 +08:00
    @vivisidea 如果过滤函数好的话 输入的时候做比输出的时候做应该要省很多事 而且防xss的话也并不复杂吧 就我个人来说在输入的时候过滤的看的比较多
    bitinn
        7
    bitinn  
    OP
       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
        8
    bitinn  
    OP
       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
        9
    otokaze  
       2015-04-27 09:54:06 +08:00
    居然是店长~快快合影,xxs我一般都在输出的时候用htmlspecialchars来完成格式化,一般不会出现问题
    lincanbin
        10
    lincanbin  
       2015-04-27 11:07:15 +08:00 via Android
    考虑性能可以在入库前做
    jprovim
        11
    jprovim  
       2015-04-27 13:44:39 +08:00
    沒有什麼好的解法.

    1. 前端提交過濾,
    2. 後端返回過濾.
    3. 存入DB之前過濾.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2262 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 00:52 · PVG 08:52 · LAX 16:52 · JFK 19:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.