解析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 相关文章推荐
PHP的FTP学习(四)
Oct 09 PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
PHP批量生成缩略图的代码
Jul 19 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
PHP重定向的3种方式
Mar 07 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
功能强大的PHP发邮件类
Aug 29 PHP
PHP快速排序quicksort实例详解
Sep 28 PHP
php封装的page分页类完整实例
Oct 18 PHP
PHP实现下载远程图片保存到本地的方法
Jun 19 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 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
附件名前加网站名
2008/03/23 PHP
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
javascript 关闭IE6、IE7
2009/06/01 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
老生常谈js中的MVC
2017/07/25 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
python八大排序算法速度实例对比
2017/12/06 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
详解重置Django migration的常见方式
2019/02/15 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
Python 寻找局部最高点的实现
2019/12/05 Python
Python字符串三种格式化输出
2020/09/17 Python
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
新浪网技术部笔试题
2016/08/26 面试题
上海天奕面试题笔试题
2015/04/19 面试题
市场营销专业个人求职信范文
2013/12/14 职场文书
意向协议书范本
2014/04/23 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
Python内置的数据类型及使用方法
2022/04/13 Python
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle