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 相关文章推荐
Ajax PHP分页演示
Jan 02 PHP
php 友好URL的实现(吐血推荐)
Oct 04 PHP
深入php var_dump()函数的详解
Jun 05 PHP
php实现cc攻击防御和防止快速刷新页面示例
Feb 13 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 PHP
基于laravel制作APP接口(API)
Mar 15 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
Mar 18 PHP
joomla实现注册用户添加新字段的方法
May 05 PHP
php简单生成一组与多组随机字符串的方法
May 09 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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
PHP4在Windows2000下的安装
2006/10/09 PHP
php cookie 登录验证示例代码
2009/03/16 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
php链式操作的实现方式分析
2019/08/12 PHP
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
2020/04/30 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
python中from module import * 的一个坑
2014/07/20 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
介绍一下Linux文件的记录形式
2013/09/29 面试题
this关键字的作用
2016/01/30 面试题
师范应届生语文教师求职信
2013/10/29 职场文书
生日宴会答谢词
2014/01/09 职场文书
九年级化学教学反思
2014/01/28 职场文书
连锁酒店店长职责范本
2014/02/13 职场文书