php addslashes及其他清除空格的方法是不安全的


Posted in PHP onJanuary 25, 2012

清除空格的方法是不安全的,部分原因是因为字符中的空格非常多,例如 "addslashes的问题在 于黑客 可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会 被看作是单引号,所以addslashes无法成功拦截。"

最好是按照具体的参数需求校验确定是 int 等不是,外加数据库的参数操作方法.其实这个是数据库的 sql 问题,应该从源头数据库本身来解决,只不过有些数据库滑提供相应的方法罢了.

SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除。

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

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

许 多数据库本身就提供这种输入数据处理功能。例如PHP的MySQL操作函数中有addslashes()、 mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符和可能引起数据库操作出错的字 符转义。那么这三个功能函数之间有什么却别呢?下面我们就来详细讲述下。

虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入,还是建议大家加强中文防止SQL注入的检查。addslashes的问题在 于黑客 可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会 被看作是单引号,所以addslashes无法成功拦截。

当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。

另外对于php手册中get_magic_quotes_gpc的举例:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname']);
} else {
$lastname = $_POST[‘lastname'];
}
最好对magic_quotes_gpc已经开放的情况下,还是对$_POST['lastname']进行检查一下。

再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。

总结一下:

* addslashes() 是强行加\;
* mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集。

dz中的防止sql注入就是用addslashes这个函数,同时在dthmlspecialchars这个函数中有进行一些替换$string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1',这个替换解决了注入的问题,同时也解决了中文乱码的一些问题

PHP 相关文章推荐
最令PHP初学者头痛的十四个问题
Jul 12 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
PHP制作用户注册系统
Oct 23 PHP
smarty简单应用实例
Nov 03 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
Sep 23 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
PHP从尾到头打印链表实例讲解
Sep 27 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
Jan 20 #PHP
php中将数组存到文件里的实现代码
Jan 19 #PHP
PHP取进制余数函数代码
Jan 19 #PHP
PHP采集腾讯微博的实现代码
Jan 19 #PHP
Php图像处理类代码分享
Jan 19 #PHP
调试一段PHP程序时遇到的三个问题
Jan 17 #PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 #PHP
You might like
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
js Form.elements[i]的使用实例
2011/11/13 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
在layui下对元素进行事件绑定的实例
2019/09/06 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
python实现socket端口重定向示例
2014/02/10 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
import的本质解析
2017/10/30 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
英语专业个人求职信范文
2014/02/01 职场文书
品牌宣传方案
2014/03/21 职场文书
《将心比心》教学反思
2014/04/08 职场文书
难忘的一天教学反思
2014/04/30 职场文书
网络技术专业求职信
2014/07/13 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
撤诉书怎么写
2015/05/19 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android
php实例化对象的实例方法
2021/11/17 PHP