PHP与SQL注入攻击防范小技巧


Posted in PHP onSeptember 16, 2011

下面来谈谈SQL注入攻击是如何实现的,又如何防范。

 看这个例子:

// supposed input 
$name = "ilia'; DELETE FROM users;"; 
mysql_query("SELECT * FROM users WHERE name='{$name}'");

 很明显最后数据库执行的命令是:

SELECT * FROM users WHERE name=ilia; DELETE FROM users

 这就给数据库带来了灾难性的后果?所有记录都被删除了。

 不过如果你使用的数据库是MySQL,那么还好,mysql_query()函数不允许直接执行这样的操作(不能单行进行多个语句操作),所以你可以放心。如果你使用的数据库是SQLite或者PostgreSQL,支持这样的语句,那么就将面临灭顶之灾了。

 上面提到,SQL注入主要是提交不安全的数据给数据库来达到攻击目的。为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加上反斜杠\。

 但Magic Quotes并不是一个很通用的解决方案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启用。所以,我们还需要使用其它多种方法来防止SQL注入。

 许多数据库本身就提供这种输入数据处理功能。例如PHP的MySQL操作函数中有一个叫mysql_real_escape_string()的函数,可将特殊字符和可能引起数据库操作出错的字符转义。

 看这段代码:

//如果Magic Quotes功用启用 
if (get_magic_quotes_gpc()) { 
$name = stripslashes($name); 
}else{ 
$name = mysql_real_escape_string($name); 
} mysql_query("SELECT * FROM users WHERE name='{$name}'");

 注意,在我们使用数据库所带的功能之前要判断一下Magic Quotes是否打开,就像上例中那样,否则两次重复处理就会出错。如果MQ已启用,我们要把加上的\去掉才得到真实数据。

 除了对以上字符串形式的数据进行预处理之外,储存Binary数据到数据库中时,也要注意进行预处理。否则数据可能与数据库自身的存储格式相冲突,引起数据库崩溃,数据记录丢失,甚至丢失整个库的数据。有些数据库如 PostgreSQL,提供一个专门用来编码二进制数据的函数pg_escape_bytea(),它可以对数据进行类似于Base64那样的编码。

 如:

// for plain-text data use: 
pg_escape_string($regular_strings); // for binary data use: 
pg_escape_bytea($binary_data);

 另一种情况下,我们也要采用这样的机制。那就是数据库系统本身不支持的多字节语言如中文,日语等。其中有些的ASCII范围和二进制数据的范围重叠。

 不过对数据进行编码将有可能导致像LIKE abc% 这样的查询语句失效。

PHP 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
多个PHP中文字符串截取函数
Nov 12 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
Linux下安装oracle客户端并配置php5.3
Oct 12 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
PHP获取youku视频真实flv文件地址的方法
Dec 23 PHP
php+mysqli实现批量替换数据库表前缀的方法
Dec 29 PHP
Zend Framework实现将session存储在memcache中的方法
Mar 22 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
Nov 17 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
Jun 05 PHP
PHP遍历数组的6种方式总结
Nov 17 PHP
php中判断字符串是否全是中文或含有中文的实现代码
Sep 16 #PHP
php中模拟POST传递数据的两种方法分享
Sep 16 #PHP
php中获得视频时间总长度的另一种方法
Sep 15 #PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 #PHP
Sorting Array Values in PHP(数组排序)
Sep 15 #PHP
PHP 图片上传代码
Sep 13 #PHP
php中json_encode中文编码问题分析
Sep 13 #PHP
You might like
php使用base64加密解密图片示例分享
2014/01/20 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
使用python爬取B站千万级数据
2018/06/08 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
华为C++笔试题
2014/08/05 面试题
食品行业求职人的自我评价
2014/01/19 职场文书
预备党员的自我评价
2014/03/12 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
残疾人小组计划书
2014/04/27 职场文书
爱的承诺书
2015/01/20 职场文书
考试作弊检讨
2015/01/27 职场文书
院系推荐意见
2015/06/05 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers