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 相关文章推荐
给多个地址发邮件的类
Oct 09 PHP
析构函数与php的垃圾回收机制详解
Oct 28 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
twig模板获取全局变量的方法
Feb 05 PHP
php生成Android客户端扫描可登录的二维码
May 13 PHP
php 多文件上传的实现实例
Oct 23 PHP
PHP生成唯一ID之SnowFlake算法
Dec 17 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
PHP实现的分解质因数操作示例
Aug 01 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
PHP中用Trait封装单例模式的实现
Dec 18 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动态变静态原理
2006/11/25 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
微信小程序button组件使用详解
2018/01/31 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
举例讲解Python中的算数运算符的用法
2015/05/13 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
如何理解transaction事务的概念
2015/05/27 面试题
中专毕业自我鉴定
2013/10/16 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
实习介绍信范文
2015/05/05 职场文书
毕业生政审意见范文
2015/06/04 职场文书
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL