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木马攻击防御之道
Mar 24 PHP
php $_SERVER["REQUEST_URI"]获取值的通用解决方法
Jun 21 PHP
PHP Array交叉表实现代码
Aug 05 PHP
解析zend Framework如何自动加载类
Jun 28 PHP
php启用sphinx全文搜索的实现方法
Dec 24 PHP
php调用KyotoTycoon简单实例
Apr 02 PHP
php随机获取金山词霸每日一句的方法
Jul 09 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
java微信开发之上传下载多媒体文件
Jun 24 PHP
PHP下的浮点运算不准的解决方法
Oct 27 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
Jun 25 PHP
解决laravel5.4下的group by报错的问题
Oct 16 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
php 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
php实现文件下载更能介绍
2012/11/23 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
使用python计算三角形的斜边例子
2020/04/15 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
应聘自荐信
2013/12/14 职场文书
大学生毕业的自我评价分享
2014/01/02 职场文书
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
幼儿运动会邀请函
2014/01/17 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
银行竞聘报告范文
2014/11/06 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript