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 相关文章推荐
第1次亲密接触PHP5(2)
Oct 09 PHP
我常用的几个类
Oct 09 PHP
利用static实现表格的颜色隔行显示
Oct 09 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 PHP
PHP中单引号与双引号的区别分析
Aug 19 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
php显示时间常用方法小结
Jun 05 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
php插入mysql数据返回id的方法
May 31 PHP
laravel http 自定义公共验证和响应的方法
Sep 29 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 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 current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Python shelve模块实现解析
2019/08/28 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
python环境下安装opencv库的方法
2020/03/05 Python
python logging.info在终端没输出的解决
2020/05/12 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
中间件分为哪几类
2016/09/18 面试题
竞选部门副经理的自荐书范文
2014/02/11 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
2016国庆促销广告语
2016/01/28 职场文书
公司转让协议书
2016/03/19 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书