Mysqli 和 PDO 能解决数据库注入问题吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
ivito
V2EX    PHP

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

  •  
  •   ivito Aug 10, 2015 4724 views
    This topic created in 3916 days ago, the information mentioned may be changed or developed.
    看着PDO接口里也有执行SQL语句的函数,如何解决注入问题呢
    23 replies    2015-08-10 18:07:10 +08:00
    realpg
        1
    realpg  
    PRO
       Aug 10, 2015
    从旧时候过来的人,一个很喜欢注入别人程序的人,写程序时候自带防注入功能。

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

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

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

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

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

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


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

    详情见文章:
    http://www.runoob.com/php/php-mysql-prepared-statements.html
    txlty
        23
    txlty  
       Aug 10, 2015
    如果你用 pdo->query() 直接执行sql语句,那还是得用 pdo->quote() 把外部变量处理下。
    About     Help     Advertise     Blog     API     FAQ     Solana     1579 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 62ms UTC 16:24 PVG 00:24 LAX 09:24 JFK 12:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86