解析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 提速工具eAccelerator 配置参数详解
May 16 PHP
php 5.3.5安装memcache注意事项小结
Apr 12 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
Sep 19 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
php实现用于验证所有类型的信用卡类
Mar 24 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 PHP
PHP 的Opcache加速的使用方法
Dec 29 PHP
PHP连接MySQL数据库并以json格式输出
May 21 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 strtr() 函数使用说明
2008/11/21 PHP
获取URL文件名后缀
2013/10/24 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
php实现购物车功能(上)
2020/07/23 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
UI Events 用户界面事件
2012/06/27 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
Python实现删除文件但保留指定文件
2015/06/21 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python多进程并行代码实例
2019/09/30 Python
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
医学毕业生自我鉴定
2013/10/30 职场文书
2014年基层党组织公开承诺书
2014/03/29 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python
go语言-在mac下brew升级golang
2021/04/25 Golang
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS