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 相关文章推荐
PHP4实际应用经验篇(5)
Oct 09 PHP
PHP 中文处理技巧
Apr 25 PHP
php在项目中寻找代码的坏味道(综艺命名)
Jul 19 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
php实现每天自动变换随机问候语的方法
May 12 PHP
Symfony2在Nginx下的配置方法图文教程
Feb 04 PHP
php时间计算相关问题小结
May 09 PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
Jun 12 PHP
Laravel中正确地返回HTTP状态码方法示例
Sep 10 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 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
如何在PHP程序中防止盗链
2008/04/09 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
2011/07/04 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
Python3 中文文件读写方法
2018/01/23 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
Python3数字求和的实例
2019/02/19 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
煤矿班组长的职责
2013/12/25 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
报社实习生自荐信
2014/01/24 职场文书
社会发展项目建议书
2014/08/25 职场文书
个人委托书怎么写
2014/09/17 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
小学元宵节活动总结
2015/02/06 职场文书
重阳节慰问信
2015/02/15 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis