解析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 10 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
Feb 17 PHP
php修改指定文件后缀的方法
Sep 11 PHP
19个Android常用工具类汇总
Dec 30 PHP
PHP获取毫秒级时间戳的方法
Apr 15 PHP
PHP+Ajax实时自动检测是否联网的方法
Jul 01 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
Mar 21 PHP
thinkPHP2.1自定义标签库的导入方法详解
Jul 20 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
PHP模型Model类封装数据库操作示例
Mar 14 PHP
PHP与Web页面交互操作实例分析
Jun 02 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
php win下Socket方式发邮件类
2009/08/21 PHP
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
centos6.4下python3.6.1安装教程
2017/07/21 Python
python实现图书管理系统
2018/03/12 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
Python datetime 如何处理时区信息
2020/09/02 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
京东奢侈品:全球奢侈品牌
2018/03/17 全球购物
优秀员工个人的自我评价
2013/11/29 职场文书
大学生实习思想汇报
2014/01/12 职场文书
工作失误检讨书范文大全
2014/01/13 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
廉洁自律承诺书
2014/03/27 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
七年级话题作文之执着
2019/11/19 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers