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

PHP 之防御 sql 注入攻击的方式

  •  
  •   lampbrother · 2016-07-25 14:23:38 +08:00 · 2587 次点击
    这是一个创建于 3022 天前的主题,其中的信息可能已经有所发展或是发生改变。

    长期以来, web 的安全性存在着巨大的争议与挑战。其中, sql 注入就是一种常见的一种攻击方法,开发人员普遍的做法就是不停的过滤,转义参数,可是我们 php 大法天生弱类型的机制,总是让黑客有机可乘,绕过防御与防御总是在明争暗斗。

    兄弟连( www.lampbrother.net ) PHP 大牛说过一句话,在一个程序中, 60%的代码都应该是在进行各种防御。

    其实,现在来看,防御 sql 注入其实并不需要进行各种参数过滤,以下将开启干货模式!

    PHP5.x 开始引入了一种新的 mysql 操作方式-----mysqli ,在 php 中也有一项相应的操作方式叫做 PHP 预处理。采用面向对象的方式来进行参数化绑定操作,由于对数据库操作的模式驱动不同,因此可以非常有效的防御 sql 注入。

    首先,我们先来看一段代码例子 php 代码:

    prepare($search_sql);//进行预处理操作

    $search_action ->bind_param("s",$keywords);//绑定参数,第一个参数表示为上面预处理的的占位符的数量和每一个参数的数据类型, s 为字符串, i 为整形, d 为双精度小数,有几个参数,就写几个 s 或 d 或 i ,比如说 iiii,ssss,sidi 这样的。然后后面就是有几个参数就写几个要绑定的变量,比如 bind_param('sss',$username,$password,$code); $search_action ->bind_result($content);//将结果绑定在相对应的变量上,比如你 select 了 username,password,你就可以写 bind_result($usernmae,$password); $search_action ->execute();//执行 sql 操作 while($search_action ->fetch()){ echo $content.'
    '; } $search_action ->free_result();//释放内存 $search_action ->close();//结束这个实例化 ?> 上面是 php 预处理中一个非常简单的例子,它内置的其他函数能很方便我们的开发速度,那么看到这里,很多人可能还是不明白,有人可能想问,你这个绑定参数是不是还是在拼凑 sql 语句?如果是拼凑语句,那还不是会产生注入吗?

    这就要从他的操作原理来解释了,其实它在 prepare 操作中,就已经在数据库中,执行了语句,以后的绑定参数和执行,只不过是再传递数据进去而已,所以根本不会和 sql 语句拼接,也就自然不会将危险代码执行。因此,在这种模式下 sql 注入就能很有效的被防御了。

    在 php 预处理的类中有很多很好用的操作,具体的兄弟连将会在以后的文章中为大家总结一些常用的 php 预处理的开发语句。

    cxbig
        1
    cxbig  
       2016-07-25 15:59:33 +08:00
    这年头还在推广用 mysqli ,别误人子弟了好吧。。。
    mko0okmko0
        2
    mko0okmko0  
       2016-07-25 16:52:59 +08:00
    直接讲 prepare 就好了,PDO 跟 mysqli/mysql 驱动都有这些东西,用什么驱动不是重点,
    重点是,prepare 挡不住全部的插入攻击,尤其是 like '%?%' 有用 like 的应该要额外处理.
    kuannz
        3
    kuannz  
       2016-07-25 18:52:29 +08:00
    xming
        4
    xming  
       2016-07-25 19:02:52 +08:00 via Android
    垃圾兄弟连 推广都搞到这了
    xming
        5
    xming  
       2016-07-25 19:03:04 +08:00 via Android
    呸呸
    SlipStupig
        6
    SlipStupig  
       2016-07-25 22:59:02 +08:00
    mysqli 并不安全,比如 A beteewn B 这个时候还是能进行盲注,最安全的还是编译 sql 语句....
    npc0der
        7
    npc0der  
       2016-07-26 09:45:07 +08:00
    60%代码在进行防御的能称为大牛?别误人子弟了吧!个人观点 不喜可喷!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:31 · PVG 22:31 · LAX 07:31 · JFK 10:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.