php打开远程文件的方法和风险及解决方法


Posted in PHP onNovember 12, 2013

PHP有一个配置选项叫allow_url_fopen,该选项默认是有效的。它允许你指向许多类型的资源,并像本地文件一样处理。例如,通过读取URL你可以取得某一个页面的内容(HTML),看下面的代码

<?php
$contents = file_get_contents('https://3water.com/');
?>

当被污染数据用于include和require的文件指向时,会产生严重漏洞。实际上,我认为这种漏洞是PHP应用中最危险的漏洞之一,这是因为它允许攻击者执行任意代码。尽管严重性在级别上要差一点,但在一个标准文件系统函数中使用了被污染数据的话,会有类似的漏洞产生:
<?php
$contents = file_get_contents($_GET['filename']);
?>

该例使用户能操纵file_get_contents( )的行为,以使它获取远程资源的内容。考虑一下类似下面的请求:
http://example.org/file.php?file ... mple.org%2Fxss.html
这就导致了$content的值被污染的情形,由于这个值是通过间接方式得到的,因此很可能会忽视这个事实。这也是深度防范原则会视文件系统为远程的数据源,同时会视$content的值为输入,这样你的过滤机制会潜在的起到扭转乾坤的作用。
由于$content值是被污染的,它可能导致多种安全漏洞,包括跨站脚本漏洞和SQL注入漏洞。例如,下面是跨站脚本漏洞的示例:
<?php
$contents = file_get_contents($_GET['filename']);
echo $contents;
?>

解决方案是永远不要用被污染的数据去指向一个文件名。要坚持过滤输入,同时确信在数据指向一个文件名之前被过滤即可:
<?php
$clean = array();
/* Filter Input ($_GET['filename']) */
$contents = file_get_contents($clean['filename']);
?>

尽管无法保证$content中的数据完全没有问题,但这还是给出了一个合理的保证,即你读取的文件正是你想要读取的文件,而不是由攻击者指定的。为加强这个流程的安全性,你同样需要把$content看成是输入,并在使用前对它进行过滤。
<?php
$clean = array();
$html = array();
/* Filter Input ($_GET['filename']) */
$contents = file_get_contents($clean['filename']);
/* Filter Input ($contents) */
$html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8');
echo $html['contents'];
?>

上面的流程提供了防范多种攻击的强有力的方法,同时在实际编程中推荐使用。
PHP 相关文章推荐
简单介绍下 PHP5 中引入的 MYSQLI的用途
Mar 19 PHP
php生成SessionID和图片校验码的思路和实现代码
Mar 10 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
Jun 03 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
Mar 23 PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP SESSION机制的理解与实例
Mar 22 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 PHP
PHP实现随机发扑克牌
Apr 22 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 PHP
php使用exec shell命令注入的方法讲解
Nov 12 #PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 #PHP
PHP迭代器的内部执行过程详解
Nov 12 #PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 #PHP
PHP SPL使用方法和他的威力
Nov 12 #PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 #PHP
php获取远程图片体积大小的实例
Nov 12 #PHP
You might like
利用static实现表格的颜色隔行显示
2006/10/09 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
犀利的js 函数集合
2009/06/11 Javascript
javascript 图片裁剪技巧解读
2012/11/15 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
javascript 动态创建表格
2015/01/08 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
webpack4从0搭建组件库的实现
2020/11/29 Javascript
Django中的Signal代码详解
2018/02/05 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
领导接待方案
2014/03/13 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
股东出资协议书
2016/03/21 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
python 实现的截屏工具
2021/05/08 Python
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
Golang ort 中的sortInts 方法
2022/04/24 Golang
如何利用python创作字符画
2022/06/25 Python