zoukankan      html  css  js  c++  java
  • 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注入的代码

    //去除转义字符
    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;  }
    $_POST = array_map('stripslashes_deep', $_POST);
    
    
     

    去除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注入,前提是你得有一定的“正则”基础。

  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/tjws/p/3580024.html
Copyright © 2011-2022 走看看