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 相关文章推荐
在PHP3中实现SESSION的功能(二)
Oct 09 PHP
php+mysql分页代码详解
Mar 27 PHP
php购物网站支付paypal使用方法
Nov 28 PHP
PHP中如何定义和使用常量
Feb 28 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
php实现httpRequest的方法
Mar 13 PHP
谈谈 PHP7新增功能
Dec 16 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
Apr 27 PHP
PHP上传文件及图片到七牛的方法
Jul 25 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 PHP
PHP CURL中传递cookie的方法步骤
May 09 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
PHP 函数语法介绍一
2009/06/14 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
2015/08/26 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
js实现3D旋转相册
2020/08/02 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
python实现装饰器、描述符
2018/02/28 Python
python format 格式化输出方法
2018/07/16 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
Python descriptor(描述符)的实现
2020/11/15 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
工商管理专业实习生自我鉴定
2013/09/29 职场文书
电子商务专业个人的自我评价分享
2013/10/29 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
二手车转让协议书
2015/01/29 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android