解析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正则走开
Mar 15 PHP
php Http_Template_IT类库进行模板替换
Mar 19 PHP
php用数组返回无限分类的列表数据的代码
Aug 08 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
Jul 28 PHP
浅谈php中include文件变量作用域
Jun 18 PHP
php验证码实现代码(3种)
Sep 07 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 PHP
PHP strripos函数用法总结
Feb 11 PHP
提高Laravel应用性能方法详解
Jun 24 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 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 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
jQuery 操作XML入门
2008/12/25 Javascript
JQuery插件开发示例代码
2013/11/06 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
vue debug 二种方法
2018/09/16 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
python之import机制详解
2014/07/03 Python
python多线程下信号处理程序示例
2019/05/31 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
Overload和Override的区别
2012/09/02 面试题
国际商务系学生个人的自我评价
2013/11/26 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
班主任对学生的评语
2014/04/26 职场文书
工作年限证明模板
2014/11/01 职场文书
施工安全员岗位职责
2015/04/11 职场文书
同事离别感言
2015/08/04 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL