解析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 相关文章推荐
用文本文件制作留言板提示(下)
Oct 09 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
让PHP支持断点续传的源码
May 16 PHP
linux iconv方法的使用
Oct 01 PHP
基于PHP CURL用法的深入分析
Jun 09 PHP
ThinkPHP模版引擎之变量输出详解
Dec 05 PHP
php定时执行任务设置详解
Feb 06 PHP
php实现cookie加密的方法
Mar 10 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
PHP7常量数组用法分析
Sep 26 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 25 PHP
PDO::inTransaction讲解
Jan 28 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 在线翻译函数代码
2009/05/07 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
ThinkPHP关于session的操作方法汇总
2014/07/18 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
php判断表是否存在的方法
2015/06/18 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
python实现对csv文件的列的内容读取
2018/07/04 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
python实现粒子群算法
2020/10/15 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
打架检讨书100字
2014/01/19 职场文书
收银员岗位职责
2014/02/07 职场文书
电台编导求职信
2014/05/06 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
成绩单评语
2015/01/04 职场文书
车间质检员岗位职责
2015/04/08 职场文书
深入浅析python3 依赖倒置原则(示例代码)
2021/07/09 Python
Python函数对象与闭包函数
2022/04/13 Python
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers