解析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 相关文章推荐
模板引擎Smarty深入浅出介绍
Dec 06 PHP
PHP+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 PHP
PHP中两个float(浮点数)比较实例分析
Sep 27 PHP
详解php中反射的应用
Mar 15 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
thinkPHP框架中执行事务的方法示例
May 31 PHP
php使用QueryList轻松采集js动态渲染页面方法
Sep 11 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
Jan 17 PHP
基于PHP的登录和注册的功能的实现
Aug 06 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简单实现无限分类树形列表的方法
2015/03/27 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
node+vue实现文件上传功能
2020/05/28 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
python抓取网页中的图片示例
2014/02/28 Python
python编写的最短路径算法
2015/03/25 Python
python如何在终端里面显示一张图片
2016/08/17 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
python数据抓取3种方法总结
2021/02/07 Python
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
餐饮主管岗位职责
2013/12/10 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
劳模事迹材料范文
2014/12/24 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
思想道德自我评价2015
2015/03/09 职场文书
学会感恩主题班会
2015/08/12 职场文书
创业计划之特色精品店
2019/08/12 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python