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

Mysqli 和 PDO 能解决数据库注入问题吗

  •  
  •   ivito · 2015-08-10 10:22:20 +08:00 · 4091 次点击
    这是一个创建于 3422 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看着PDO接口里也有执行SQL语句的函数,如何解决注入问题呢
    23 条回复    2015-08-10 18:07:10 +08:00
    realpg
        1
    realpg  
       2015-08-10 10:27:25 +08:00
    从旧时候过来的人,一个很喜欢注入别人程序的人,写程序时候自带防注入功能。

    已经下意识的任何可能传入查询的非可控部分进行假想会被怎么注入,虽然写程序会慢一点,但是质量好。

    这种意识养成后,就会逐渐进化到写啥代码想的都很多会不会有问题,写出代码需要调试DEBUG的时候就少。但是代价就是写东西会变慢,而且逐渐有强迫症写啥都追求质量速度就快不了……
    realpg
        2
    realpg  
       2015-08-10 10:29:53 +08:00
    而且跟我合作过的或者我教出来的PHP程序员,都有很好的习惯。外部数值变量进来一律intval、floatval,字符串变量任何时候带入查询不走有过滤功能的querybuilder时候一律严格处理防注

    另外,曾经的公司设立过Anti Injection奖金……督促养成这个习惯
    anubiskong
        3
    anubiskong  
       2015-08-10 10:35:01 +08:00
    mongodb
    MrJing1992
        4
    MrJing1992  
       2015-08-10 10:45:20 +08:00
    使用 PDOStatement 类。
    jiangzhuo
        5
    jiangzhuo  
       2015-08-10 11:04:23 +08:00
    @anubiskong 很多用mongodb的不考虑防注入的,往往是被注入的最惨的。
    zhugeliang
        6
    zhugeliang  
       2015-08-10 11:31:35 +08:00
    php的话有很多方法可以过滤啊
    incompatible
        7
    incompatible  
       2015-08-10 11:44:38 +08:00
    @realpg 我觉得你说了一大篇都没说到点子上
    最好的防注入的习惯就是使用参数绑定而不是自己拼接sql
    tabris17
        8
    tabris17  
       2015-08-10 11:46:59 +08:00
    SQL Injection是不经过滤自行拼接SQL语句造成的,和使用什么访问接口无关
    msg7086
        9
    msg7086  
       2015-08-10 11:49:15 +08:00
    就是意识问题。
    有这个意识的人,就算用最原始的接口也能写出安全的代码来。
    500miles
        10
    500miles  
       2015-08-10 11:55:39 +08:00
    使用PDO 就完全可以对 sql Inject say goodbye了..

    前提是 : 一定要使用参数绑定 并且声明 不要在语言层面 帮你进行解析参数,组织sql... 而是发送sql语句 和 参数变量 给mysql去处理...
    lijianying10
        11
    lijianying10  
       2015-08-10 11:59:14 +08:00
    用stmt可好?目前我就是这么做的。
    yakczh
        12
    yakczh  
       2015-08-10 12:19:28 +08:00
    不用参数绑带, $pdo->execute($params); 这样所有参数都当成字符串,会统一加上引号,有引号的会加反斜线
    anubiskong
        13
    anubiskong  
       2015-08-10 13:02:07 +08:00
    @jiangzhuo 你举个例子
    breeswish
        14
    breeswish  
       2015-08-10 13:30:52 +08:00
    @anubiskong MongoDB 的查询是可以注入的,例如利用语言特性传一个 {$ne:xxx} 对象(而不是一个字符串)
    breeswish
        15
    breeswish  
       2015-08-10 13:31:50 +08:00
    使用参数化查询就可以解决注入问题,PDO 支持参数化查询,所以,要使用 PDO 解决注入问题请使用 PDO 的参数化查询功能
    anubiskong
        16
    anubiskong  
       2015-08-10 13:43:59 +08:00
    @breeswish 所以说是php的问题不是mongo的?
    minvacai
        17
    minvacai  
       2015-08-10 13:53:53 +08:00
    所以说用python的话只要把用户传来的内容都当字符串处理就没问题了是吧……
    breeswish
        18
    breeswish  
       2015-08-10 14:53:59 +08:00
    @anubiskong 我觉得两个都没问题,对于 PHP 来说,允许传入参数转换为对象是一个有用的 feature,对于 MongoDB 来说,用这种方式查询也是个 feature…… 问题在于开发者可能会盲目地认为 MongoDB 不会有注入风险忽视了这些特性和因素——传给 MongoDB 的参数「需要」限制类型。

    就像当初 SQL 那样.. 一开始大家怎么会想得到直接拼接字符串会拼出问题来呢……虽然现在看来是很显然的,不过也许当初就是大家都没意识到
    jiangzhuo
        19
    jiangzhuo  
       2015-08-10 17:08:36 +08:00
    @anubiskong cnodejs论坛好像就被注入过不止一次,因为是开源项目很快就能把漏洞补上了
    jadecoder
        20
    jadecoder  
       2015-08-10 17:29:56 +08:00
    我在用PDO,但是一直没明白这个能不能防宽字节注入
    txlty
        21
    txlty  
       2015-08-10 17:50:52 +08:00
    pdo->quote()
    ivito
        22
    ivito  
    OP
       2015-08-10 18:01:27 +08:00
    @tabris17

    @500miles 说的对,需要用参数绑定


    @yakczh 其实$pdo->execute()实际上也是用的参数绑定

    详情见文章:
    http://www.runoob.com/php/php-mysql-prepared-statements.html
    txlty
        23
    txlty  
       2015-08-10 18:07:10 +08:00
    如果你用 pdo->query() 直接执行sql语句,那还是得用 pdo->quote() 把外部变量处理下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2569 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:30 · PVG 08:30 · LAX 16:30 · JFK 19:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.