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 相关文章推荐
PHP截取中文字符串的问题
Jul 12 PHP
用文本文件制作留言板提示(下)
Oct 09 PHP
PHP语法速查表
Dec 06 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
Jul 07 PHP
php中var_export与var_dump的区别分析
Aug 21 PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
浅析Yii2 GridView实现下拉搜索教程
Apr 22 PHP
PHP中抽象类和抽象方法概念与用法分析
May 24 PHP
微信支付开发订单查询实例
Jul 12 PHP
PHP大神的十大优良习惯
Sep 14 PHP
PHP获取当前执行php文件名的代码
Mar 02 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和ACCESS写聊天室(八)
2006/10/09 PHP
php上传文件的增强函数
2010/07/21 PHP
PHP仿盗链代码
2012/06/03 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
php实现的常见排序算法汇总
2014/09/08 PHP
使用js获取QueryString的方法小结
2010/02/28 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
Python学习笔记(二)基础语法
2014/06/06 Python
Python列表(list)常用操作方法小结
2015/02/02 Python
Python实现分割文件及合并文件的方法
2015/07/10 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
python3判断url链接是否为404的方法
2018/08/10 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
如何在python中实现线性回归
2020/08/10 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
小学国庆节活动方案
2014/02/11 职场文书
庆祝国庆节标语
2014/10/09 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书