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获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
php 生成饼图 三维饼图
Sep 28 PHP
让你成为更出色的PHP开发者的10个技巧
Feb 25 PHP
php设计模式 State (状态模式)
Jun 26 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
Sep 23 PHP
php判断手机访问还是电脑访问示例分享
Jan 20 PHP
PHP把网页保存为word文件的三种方法
Apr 01 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 PHP
PHP正则判断一个变量是否为正整数的方法
Feb 27 PHP
PHP的静态方法与普通方法用法实例分析
Sep 26 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引用地址改变变量值的问题
2012/03/23 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
php利用curl抓取新浪微博内容示例
2014/04/27 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
Element input树型下拉框的实现代码
2018/12/21 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
Python基于DES算法加密解密实例
2015/06/03 Python
python通过socket查询whois的方法
2015/07/18 Python
Python生成随机密码的方法
2017/06/16 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
金融专业推荐信
2013/11/14 职场文书
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
小学生打架检讨书
2014/01/26 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
岗位职责怎么写
2014/03/14 职场文书
家长通知书家长评语
2014/04/17 职场文书
学生操行评语大全
2014/04/24 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
法院授权委托书格式
2014/09/28 职场文书
2016年父亲节寄语
2015/12/04 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书