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读取MySQL数据代码
Jun 05 PHP
PHP-MySQL教程归纳总结
Jun 07 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 PHP
PHP实现图片旋转效果实例代码
Oct 01 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
利用PHP实现开心消消乐的算法示例
Oct 12 PHP
tp5实现微信小程序多图片上传到服务器功能
Jul 16 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
Aug 03 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判断服务器是否是HTTPS连接
2013/07/05 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
phpwind放自动注册方法
2006/12/02 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
jQuery中的for循环var与let的区别
2018/04/21 jQuery
vue-cli 打包后提交到线上出现 "Uncaught SyntaxError:Unexpected token" 报错
2018/11/06 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
python判断计算机是否有网络连接的实例
2018/12/15 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
美国在线珠宝商店:SZUL
2017/02/11 全球购物
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
出纳员的岗位职责
2014/02/22 职场文书
学员自我鉴定
2014/03/19 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
车贷收入证明范本
2014/09/14 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
MySQL开启事务的方式
2021/06/26 MySQL
 Python 中 logging 模块使用详情
2022/03/03 Python