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之第九天
Oct 09 PHP
Smarty模板快速入门
Jan 04 PHP
php获得当前的脚本网址
Dec 10 PHP
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
第五章 php数组操作
Dec 30 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
php笔记之:php函数range() round()和list()的使用说明
Apr 26 PHP
CI框架的安全性分析
May 18 PHP
PHP实现阿里大鱼短信验证的实例代码
Jul 10 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 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中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
Add Formatted Data to a Spreadsheet
2007/06/12 Javascript
基于JQuery的日期联动实现代码
2011/02/24 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
javascript中clone对象详解
2014/12/03 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
拖动时防止选中
2017/02/03 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Python List cmp()知识点总结
2019/02/18 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
Python数据类型之Dict字典实例详解
2019/05/07 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
党员学习十八大感想
2014/01/17 职场文书
演讲主持词
2014/03/18 职场文书
病危通知单
2015/04/17 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python