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加速 eAccelerator配置和使用指南
Jun 05 PHP
PHP 输出简单动态WAP页面
Jun 09 PHP
php程序之die调试法 快速解决错误
Sep 17 PHP
php对二维数组按指定键值key排序示例代码
Nov 26 PHP
PHP实现批量生成App各种尺寸Logo
Mar 19 PHP
PHP微信开发用Cache 解决数据缓存
Jul 11 PHP
PHP自定义多进制的方法
Nov 03 PHP
浅谈PHP中new self()和new static()的区别
Aug 11 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 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 数组使用详解 推荐
2011/06/02 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
不要用强制方法杀掉python线程
2017/02/26 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
python如何支持并发方法详解
2020/07/25 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
社会保险接收函
2014/01/12 职场文书
小学三八妇女节活动方案
2014/03/16 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
党校个人总结
2015/03/04 职场文书
欠条格式范本
2015/07/03 职场文书
企业培训简报范文
2015/07/20 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS
python cv2图像质量压缩的算法示例
2021/06/04 Python