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 年龄计算函数(精确到天)
Jun 07 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
Feb 17 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
php 中的closure用法详解
Jun 12 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
php从数据库中获取数据用ajax传送到前台的方法
Aug 20 PHP
浅谈laravel orm 中的一对多关系 hasMany
Oct 21 PHP
Laravel框架数据库迁移操作实例详解
Apr 06 PHP
tp5.1 框架查询表达式用法详解
May 25 PHP
PHP网页缓存技术优点及代码实例
Jul 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
php 字符转义 注意事项
2009/05/27 PHP
PHP 第一节 php简介
2012/04/28 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
PHP安装BCMath扩展的方法
2019/02/13 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
javascript常用正则表达式汇总
2015/07/31 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
JS实现留言板功能
2017/06/17 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
在Python中移动目录结构的方法
2016/01/31 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
C# Debug和Testing相关面试题
2015/10/25 面试题
中专毕业生的自荐书
2014/07/01 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
毕业欢送会致辞
2015/07/29 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL