PHP防范SQL注入的具体方法详解(测试通过)

 更新时间:2014年05月09日 15:36:36   作者:  
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注入的代码

复制代码 代码如下:

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

相关文章

  • JWT登录认证实战模拟过程全纪录

    JWT登录认证实战模拟过程全纪录

    jwt是由用户以用户名、密码登录,服务端验证后,会生成一个token,返回给客户端,客户端在下次访问的过程中携带这个token,服务端责每次验证这个token,下面这篇文章主要给大家介绍了关于JWT登录认证实战模拟的相关资料,需要的朋友可以参考下
    2022-08-08
  • 使用PHP函数进行网站性能监控和优化的代码示例

    使用PHP函数进行网站性能监控和优化的代码示例

    在 PHP 中,有许多内置函数和工具可以帮助我们实现网站的性能监控和优化,本文将介绍几种常用的 PHP 函数,并提供相应的代码示例,来帮助您更好地进行网站性能监控和优化,需要的朋友可以参考下
    2024-06-06
  • php中限制ip段访问、禁止ip提交表单的代码分享

    php中限制ip段访问、禁止ip提交表单的代码分享

    在项目应用中,我们经常需要用到限制ip段访问或者限制IP提交表单等等ip相关的功能,今天我来分享下本人所使用的这块代码,希望对大家有所帮助
    2014-08-08
  • 基于php双引号中访问数组元素报错的解决方法

    基于php双引号中访问数组元素报错的解决方法

    下面小编就为大家分享一篇基于php双引号中访问数组元素报错的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • PHP5函数小全(分享)

    PHP5函数小全(分享)

    本篇文章是对PHP5函数进行了详细的总结与分析,需要的朋友参考下
    2013-06-06
  • PHP 魔术函数使用说明

    PHP 魔术函数使用说明

    PHP魔术函数集锦,对于学习php的朋友可以参考下。
    2010-05-05
  • PHP求小于1000的所有水仙花数的代码

    PHP求小于1000的所有水仙花数的代码

    PHP求小于1000的所有水仙花数的代码,需要的朋友可以参考下。
    2012-01-01
  • 作为PHP程序员你要知道的另外一种日志

    作为PHP程序员你要知道的另外一种日志

    这篇文章主要给大家介绍了关于作为PHP程序员要知道的另外一种日志的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧
    2018-07-07
  • PHP的博客ping服务代码

    PHP的博客ping服务代码

    今天发一下能够直接用的ping函数,希望对大家有所帮助,还需要说明的一点是现在的ping并不是像以前那么管用了
    2012-02-02
  • php函数与传递参数实例分析

    php函数与传递参数实例分析

    这篇文章主要介绍了php函数与传递参数的方法,以实例形式分析了函数按值传递的具体用法,具有不错的参考借鉴价值,需要的朋友可以参考下
    2014-11-11

最新评论