龙岩易富通网络科技有限公司

龙岩小程序开发,龙岩分销系统

PHP防范SQL注入的方法

2015.09.10 | 47阅读 | 0条评论 | php

a. 打开magic_quotes_gpc或使用addslashes()函数  


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


// 去除转义字符   

function stripslashes_array($array) {   

   if (is_array($array)) {   

      foreach ($array as $k => $v) {   

         $array[$k] = stripslashes_array($v);   

       }   

    } 

    else if (is_string($array)) {

       $array = stripslashes($array);   

      }   

      return $array;   

    }   

    @set_magic_quotes_runtime(0);   // 判断 magic_quotes_gpc 状态   

    if (@get_magic_quotes_gpc()) {   

       $_GET = stripslashes_array($_GET);   

       $_POST = stripslashes_array($_POST);   

       $_COOKIE = stripslashes_array($_COOKIE);   

     }

去除magic_quotes_gpc的转义之后再使用addslashes函数,代码如下:


PHP防范SQL注入的代码 


$keywords = addslashes($keywords); 


$keywords = str_replace("_","\_",$keywords);//转义掉”_” 


$keywords = str_replace("%","\%",$keywords);//转义掉”%” 


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



b. 强制字符格式(类型)  在很多时候我们要用到类似xxx.php?id=xxx这样的URL,一般来说$id都是整型变量,为了防范攻击者把$id篡改成攻击语句,我们要尽量强制变量,代码如下:  


PHP防范SQL注入的代码 $id=intval($_GET[‘id’]); 当然,还有其他的变量类型,如果有必要的话尽量强制一下格式。 



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


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



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


赞 (

发表评论