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+mysql)
Nov 23 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
PHP运行模式的深入理解
Jun 03 PHP
html静态页面调用php文件的方法
Nov 13 PHP
Smarty简单生成表单元素的方法示例
May 23 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
PHP实现的MD5结合RSA签名算法实例
Oct 07 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
thinkPHP5框架分页样式类完整示例
Sep 01 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 PHP
PHP高并发和大流量解决方案整理
Dec 24 PHP
PHP实现递归的三种方法
Jul 04 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
Zend Framework框架路由机制代码分析
2016/03/22 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
2019/11/12 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
WebPack工具运行原理及入门教程
2020/12/02 Javascript
Python进行数据科学工作的简单入门教程
2015/04/01 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
Python中is和==的区别详解
2018/11/15 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
营销部内勤岗位职责
2014/04/30 职场文书
委托书格式范文
2015/01/28 职场文书
美丽的大脚观后感
2015/06/03 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL