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 相关文章推荐
php5中date()得出的时间为什么不是当前时间的解决方法
Jun 30 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
关于使用coreseek并为其做分页的介绍
Jun 21 PHP
PHP中file_get_contents高?用法实例
Sep 24 PHP
javascript数组与php数组的地址传递及值传递用法实例
Jan 22 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
smarty的section嵌套循环用法示例
May 28 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
PHP递归的三种常用方式
Feb 28 PHP
PHP封装cURL工具类与应用示例
Jul 01 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
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
基于文本的访客签到簿
2006/10/09 PHP
PHP网站备份程序代码分享
2011/06/10 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
介绍一些PHP判断变量的函数
2012/04/24 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
js玩一玩WSH吧
2007/02/23 Javascript
一个加载js文件的小脚本
2007/06/28 Javascript
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
2016/07/07 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
python实现红包裂变算法
2016/02/16 Python
Python 序列的方法总结
2016/10/18 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
某公司面试题
2012/03/05 面试题
物业管理专业个人的自我评价
2013/11/19 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
飞越疯人院观后感
2015/06/09 职场文书
2019初中学生入团申请书
2019/06/27 职场文书