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

PHP 对输入过滤是不是 htmlspecialchars 就够了? (不考虑 SQL 注入, PDO prepare 已经解决)

  •  
  •   xiaoyanbot · 2017-05-20 12:59:10 +08:00 · 4229 次点击
    这是一个创建于 2748 天前的主题,其中的信息可能已经有所发展或是发生改变。

    安全编码方面,SQL 注入由 PDO prepare 来解决, 是不是 防范安全方面,XSS 攻击什么的,是不是用 htmlspecialchars 就够了?

    比如对 $_GET 的处理:

    function get($name){
        
        return htmlspecialchars($_GET["$name"]);
        
    }
    

    这样处理后,还会有什么输入的漏洞吗? 还是说强制转 string 什么的更安全呢?

    18 条回复    2017-05-21 10:22:33 +08:00
    xiaoyanbot
        1
    xiaoyanbot  
    OP
       2017-05-20 13:20:01 +08:00
    xss
    sagaxu
        2
    sagaxu  
       2017-05-20 13:40:25 +08:00
    这是很糟糕的做法,除了 htmlspecialchars,还得有 xml_specialchars,regex_specialchars,database_specialchars 等等,在入口处统一过滤或者转义,是简单粗暴很 low 的做法,它在让你丢失原始数据的同时,并没有真正避开危险。
    nobird
        3
    nobird  
       2017-05-20 13:49:02 +08:00 via iPhone
    @sagaxu 那什么样的才是合适的方法呢?
    changwei
        4
    changwei  
       2017-05-20 13:50:23 +08:00 via Android
    @sagaxu 都已经做了实体编码,xml 的尖括号也没用了,还怎么 xml 注入呢?有点好奇啊,正则表达式注入,这个场景很少见吧,一般不会把用户输入的字符串作为正则表达式带入吧。
    aawei
        5
    aawei  
       2017-05-20 13:53:39 +08:00
    @sagaxu 我一直以为在入口处做过处理就不会有问题,那请问一下这种做法简单粗暴,那有啥比较优雅的方式处理才能避免 SQL 注入和 xss 呢??
    wangjie
        6
    wangjie  
       2017-05-20 13:53:43 +08:00
    @sagaxu #2 求教正确的做法是什么
    sagaxu
        7
    sagaxu  
       2017-05-20 14:02:15 +08:00   ❤️ 2
    @aawei 保持原始数据的传递,在消费数据的地方,按照消费方的方式去转义
    1762628386
        8
    1762628386  
       2017-05-20 14:29:33 +08:00 via iPhone
    @sagaxu 正解啊 保持原始数据
    xiaoyanbot
        9
    xiaoyanbot  
    OP
       2017-05-20 15:03:53 +08:00
    @sagaxu 按照消费方的方式去转义? 意思是不用处理,SQL 的时候,直接 prepare 解决; 在需要什么数据的时候,用 ( string ) 这种强制转义吗?
    xiaoyanbot
        10
    xiaoyanbot  
    OP
       2017-05-20 15:05:39 +08:00
    @sagaxu 已经做了 htmlspecialchars , 为什么还需要 xml_specialchars,regex_specialchars,database_specialchars

    后面这三个,有什么是 htmlspecalchars 没有过滤掉的危险字符呢? 能帮忙举个例子吗? 谢谢
    HYSS
        11
    HYSS  
       2017-05-20 15:21:35 +08:00
    Pdo prepare 的预处理完全能避免 sql 攻击
    htmlspecialchars 用于将显示的时候转义实体字符避免 xss

    附上一篇关于 pdo 预处理为什么能防止 sql 攻击的文章

    http://www.cnblogs.com/LoveJenny/archive/2013/01/15/2860553.html
    zjsxwc
        12
    zjsxwc  
       2017-05-20 15:21:43 +08:00
    是的,肯定够了。但是我们还是有需求保留安全的 html 文本,比如不把图片 img 标签给过滤掉,而对有危险的比如 script 标签、onclick 属性文本过滤,而不是一刀切全部干掉。
    shiji
        13
    shiji  
       2017-05-20 16:17:08 +08:00
    PDO prepare 并不能百分百防止注入。
    1. 要统一好整个网站,web 服务器,数据库的编码。
    2. $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 要记得设置
    3. 注意二级注入。比如用户把带危险的字符串先存进数据库,如果你想在另外一个 SQL 语句里 concat 或者直接拼接那个带危险的字符串,是可以注入的。

    至于 XSS,:
    http://stackoverflow.com/questions/19584189/when-used-correctly-is-htmlspecialchars-sufficient-for-protection-against-all-x

    ajax 的话用.text(data)也是安全的
    mcfog
        14
    mcfog  
       2017-05-20 16:45:25 +08:00
    a.输入过滤是错误的做法,正确的做法是在输出的时候按照不同的位置进行相应的合适的处理(不仅限于后端)
    b.htmlspecialchars 不带参数的时候仅适用于 html 标签内容
    c.prepare 的问题#13 基本讲了
    d.常见的还需要覆盖的有 csrf、cookie 的种种安全问题,session 的种种安全问题,密码安全等
    e.你得先知道怎么攻击才能真正知道怎么防御,很多程序员的问题在于,说起安全都能说要做 123 (当然楼主连 123 都没说对说全),但为啥要做,不做会被怎么攻击都讲不清楚,这就有很大风险会导致作出徒有其表的防御
    f.要讲安全,建议先通读 owasp cheatsheet 系列
    mingyun
        15
    mingyun  
       2017-05-20 19:26:41 +08:00
    @mcfog nice
    GoBeyond
        16
    GoBeyond  
       2017-05-20 21:25:23 +08:00 via Android
    听说自带的那个过滤的不严
    lslqtz
        17
    lslqtz  
       2017-05-21 04:34:01 +08:00
    自我觉得完全够用。在全部的地方过滤即可。
    当你不需要原始数据时,你可以过滤后放入,对性能优。
    当你需要原始数据时,你可以取出后过滤输出。
    cszchen
        18
    cszchen  
       2017-05-21 10:22:33 +08:00
    防注入,pdo 的 prepare 足矣,不用做其他处理
    防 xss,是在把用户输入的内容渲染到 html 的时候要转义
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3862 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:28 · PVG 18:28 · LAX 02:28 · JFK 05:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.