当前位置:Gxlcms > PHP教程 > php防范sql注入方法与实例代码

php防范sql注入方法与实例代码

时间:2021-07-01 10:21:17 帮助过:18人阅读

php防范sql注入是一个非常重要的安全手段。

一个优秀的php程序员除了要能顺利的编写代码,还需要具备使程序处于安全环境下的能力。今天我们要向大家讲解的是有关php防范sql注入的相关方法。 说到网站安全就不得不提到sql注入(sql injection),如果你用过asp,对sql注入一定有比较深的理解,php的安全性相对较高,这是因为mysql4以下的版本不支持子语句,而且当php.ini里的 magic_quotes_gpc 为on 时。

提交的变量中所有的 ' (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符,给sql注入带来不少的麻烦。 请看清楚:“麻烦”而已~这并不意味着php防范sql注入,书中就讲到了利用改变注入语句的编码来绕过转义的方法,比如将sql语句转成ascii编码(类似:char(100,58,92,108,111,99,97,108,104,111,115,116…)这样的格式),或者转成16进制编码,甚至还有其他形式的编码,这样以来,转义过滤便被绕过去了,那么怎样防范呢:

a. 打开magic_quotes_gpc或使用addslashes()函数 在新版本的php中,就算magic_quotes_gpc打开了,再使用addslashes()函数,也不会有冲突,但是为了更好的实现版本兼容,建议在使用转移函数前先检测magic_quotes_gpc状态,或者直接关掉,代码如下: php防范sql注入的代码

  1. // 去除转义字符
  2. function stripslashes_array($array) {
  3. if (is_array($array)) {
  4. foreach ($array as $k => $v) {
  5. $array[$k] = stripslashes_array($v);
  6. }
  7. } else if (is_string($array)) {
  8. $array = stripslashes($array);
  9. }
  10. return $array;
  11. }
  12. @set_magic_quotes_runtime(0);
  13. // 判断 magic_quotes_gpc 状态
  14. if (@get_magic_quotes_gpc()) {
  15. $_get = stripslashes_array($_get);
  16. $_post = stripslashes_array($_post);
  17. $_cookie = stripslashes_array($_cookie);
  18. }

去除magic_quotes_gpc的转义之后再使用addslashes函数,代码如下: php防范sql注入的代码

  1. $keywords = addslashes($keywords);
  2. $keywords = str_replace("_","\_",$keywords);//转义掉”_”
  3. $keywords = str_replace("%","\%",$keywords);//转义掉”%”

后两个str_replace替换转义目的是防止黑客转换sql编码进行攻击。

b. 强制字符格式(类型) 在很多时候我们要用到类似xxx.php?id=xxx这样的url,一般来说$id都是整型变量,为了防范攻击者把$id篡改成攻击语句,我们要尽量强制变量,代码如下: php防范sql注入的代码 $id=intval($_get['id']); 当然,还有其他的变量类型,如果有必要的话尽量强制一下格式。

c. sql语句中包含变量加引号 这一点儿很简单,但也容易养成习惯,先来看看这两条sql语句:

  1. select * from article where articleid='$id'
  2. select * from article where articleid=$id

两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的sql语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为sql语句执行,因此,我们要养成给sql语句中变量加引号的习惯。

d.url伪静态化 url伪静态化也就是url重写技术,像discuz!一样,将所有的url都rewrite成类似xxx-xxx-x.html格式,既有利于seo,又达到了一定的安全性,也不失为一个好办法。但要想实现php防范sql注入,前提是你得有一定的“正则”基础。

人气教程排行