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


Posted in PHP onMay 09, 2014

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

PHP 相关文章推荐
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
php根据年月获取季度的方法
Mar 31 PHP
PHP中比较时间大小实例
Aug 21 PHP
ThinkPHP中关联查询实例
Dec 02 PHP
php实现paypal 授权登录
May 28 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
CodeIgniter集成smarty的方法详解
May 26 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 PHP
PHP钩子实现方法解析
May 21 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 PHP
简单的php新闻发布系统教程
May 09 #PHP
php下载文件源代码(强制任意文件格式下载)
May 09 #PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 #PHP
win7计划任务定时执行PHP脚本设置图解
May 09 #PHP
关于php支持分块与断点续传文件下载功能代码
May 09 #PHP
PHP程序员基本要求和必备技能
May 09 #PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 #PHP
You might like
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
jquery $("#variable") 循环改变variable的值示例
2014/02/23 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
JavaScript基础心法 数据类型
2018/03/05 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
python实现的文件同步服务器实例
2015/06/02 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
Keras实现DenseNet结构操作
2020/07/06 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
Python request post上传文件常见要点
2020/11/20 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
简单通用的简历自我评价
2014/09/21 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
2014年卫生工作总结
2014/11/27 职场文书
小学生暑假安全公约
2015/07/14 职场文书
nginx配置指令之server_name的具体使用
2022/08/14 Servers