解析php安全性问题中的:Null 字符问题


Posted in PHP onJune 21, 2013

由于 PHP 的文件系统操作是基于 C 语言的函数的,所以它可能会以您意想不到的方式处理 Null 字符。 Null字符在 C 语言中用于标识字符串结束,一个完整的字符串是从其开头到遇见 Null 字符为止。 以下代码演示了类似的攻击:
Example #1 会被 Null 字符问题攻击的代码

<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
    // file_exists will return true as the file /home/wwwrun/../../etc/passwd exists
    include '/home/wwwrun/'.$file.'.php';
    // the file /etc/passwd will be included
}
?>

因此,任何用于操作文件系统的字符串(译注:特别是程序外部输入的字符串)都必须经过适当的检查。以下是上述例子的改进版本:
Example #2 验证输入的正确做法
<?php
$file = $_GET['file']; 
// 对字符串进行白名单检查
switch ($file) {
    case 'main':
    case 'foo':
    case 'bar':
        include '/home/wwwrun/include/'.$file.'.php';
        break;
    default:
        include '/home/wwwrun/include/main.php';
}
?>

一个函数错误就可能暴露系统正在使用的数据库,或者为攻击者提供有关网页、程序或设计方面的有用信息。攻击者往往会顺藤摸瓜地找到开放的数据库端口,以及页面上某些 bug 或弱点等。比如说,攻击者可以一些不正常的数据使程序出错,来探测脚本中认证的顺序(通过错误提示的行号数字)以及脚本中其它位置可能泄露的信息。

一个文件系统或者 PHP 的错误就会暴露 web服务器具有什么权限,以及文件在服务器上的组织结构。开发者自己写的错误代码会加剧此问题,导致泄漏了原本隐藏的信息。

有三个常用的办法处理这些问题。第一个是彻底地检查所有函数,并尝试弥补大多数错误。第二个是对在线系统彻底关闭错误报告。第三个是使用 PHP 自定义的错误处理函数创建自己的错误处理机制。根据不同的安全策略,三种方法可能都适用。

PHP 相关文章推荐
二十行语句实现从Excel到mysql的转化
Oct 09 PHP
PHP Zip解压 文件在线解压缩的函数代码
May 26 PHP
php array_unique之后json_encode需要注意
Jan 02 PHP
php获取mysql数据库中的所有表名的代码
Apr 23 PHP
php面向对象 字段的声明与使用
Jun 14 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
php获取当月最后一天函数分享
Feb 02 PHP
php实现的递归提成方案实例
Nov 14 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
php微信开发接入
Aug 27 PHP
laravel 之 Eloquent 模型修改器和序列化示例
Oct 17 PHP
浅析SVN常见问题及解决方法
Jun 21 #PHP
关于svn冲突的解决方法
Jun 21 #PHP
关于PHP模板Smarty的初级使用方法以及心得分享
Jun 21 #PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 #PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 #PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 #PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 #PHP
You might like
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP 事务处理数据实现代码
2010/05/13 PHP
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
jquery表单验证使用插件formValidator
2012/11/10 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
python BeautifulSoup使用方法详解
2013/11/21 Python
Python实现分割文件及合并文件的方法
2015/07/10 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
Python中Numpy mat的使用详解
2019/05/24 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
Python datetime 如何处理时区信息
2020/09/02 Python
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
大四自我鉴定范文
2013/10/06 职场文书
道德演讲稿
2014/05/21 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
爱国主题班会教案
2015/08/14 职场文书