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编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
php模块memcache和memcached区别分析
Jun 14 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
C#使用PHP服务端的Web Service通信实例
Apr 08 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
PHP自毁程序(慎用)
Jul 09 PHP
PHP 7.0.2 正式版发布
Jan 08 PHP
PHP中调用C/C++制作的动态链接库的教程
Mar 10 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
如何开始收听短波广播
2021/03/01 无线电
常用的php对象类型判断
2008/08/27 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
javascript 面向对象 function类
2010/05/13 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
浅谈javascript 迭代方法
2015/01/21 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
小结Python用fork来创建子进程注意事项
2014/07/03 Python
python实现类之间的方法互相调用
2018/04/29 Python
Python中的TCP socket写法示例
2018/05/11 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
阿姆斯特丹杜莎夫人蜡像馆官方网站:Madame Tussauds Amsterdam
2019/03/12 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
经销商会议欢迎词
2014/01/11 职场文书
国税会议欢迎词
2014/01/16 职场文书
政府信息公开实施方案
2014/05/09 职场文书
volatile保证可见性及重排序方法
2022/08/05 Java/Android