解析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 中include()与require()的对比
Oct 09 PHP
php chr() ord()中文截取乱码问题解决方法
Sep 08 PHP
PHP常用函数小技巧
Sep 11 PHP
php读取大文件示例分享(文件操作类)
Apr 13 PHP
smarty表格换行实例
Dec 15 PHP
关于PHP中Session文件过多的问题及session文件保存位置
Mar 17 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
Laravel5中防止XSS跨站攻击的方法
Oct 10 PHP
PHP实现将标点符号正则替换为空格的方法
Aug 09 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 PHP
php接口隔离原则实例分析
Nov 11 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极大的增强功能和性能
2006/10/09 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
javascript 写类方式之九
2009/07/05 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
社保转移委托书范本
2014/10/08 职场文书
公司会议开幕词
2015/01/29 职场文书
python使用glob检索文件的操作
2021/05/20 Python
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python