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 相关文章推荐
用户的详细注册和判断
Oct 09 PHP
常用表单验证类,有了这个,一般的验证就都齐了。
Dec 06 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
php cookie的操作实现代码(登录)
Dec 29 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 PHP
php中文字符串截取方法实例总结
Sep 30 PHP
PHP通过API获取手机号码归属地
May 28 PHP
详细解读PHP的Yii框架中登陆功能的实现
Aug 21 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
Aug 12 PHP
Laravel学习教程之request validation的编写
Oct 25 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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
php递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
Python continue语句用法实例
2014/03/11 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
python的sys.path模块路径添加方式
2020/03/09 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
MySQL中一条update语句是如何执行的
2022/03/16 MySQL