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读取IMAP邮件
Oct 09 PHP
用PHP读取flv文件的播放时间长度
Sep 03 PHP
c#中的实现php中的preg_replace
Dec 21 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
Dec 14 PHP
php页面缓存ob系列函数介绍
Oct 18 PHP
zend framework文件上传功能实例代码
Dec 25 PHP
php 使用array函数实现分页
Feb 13 PHP
PHP程序员的技术成长规划
Mar 25 PHP
php生成酷炫的四个字符验证码
Apr 22 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
Apr 06 PHP
PHP与Web页面交互操作实例分析
Jun 02 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实现弹出消息提示框的两种方法
2013/12/17 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
JS命名空间的另一种实现
2013/08/09 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
详解angular element()方法使用
2017/04/08 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
医药大学生求职简历的自我评价
2013/10/17 职场文书
会计学应届毕业生推荐信
2013/11/04 职场文书
信息服务专业毕业生求职信
2014/03/02 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
美容院店长岗位职责
2014/04/08 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
新生入学欢迎词
2015/01/26 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL