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 相关文章推荐
解析dedeCMS验证码的实现代码
Jun 07 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
PHP使用CURL模拟登录的方法
Jul 08 PHP
ThinkPHP模型详解
Jul 27 PHP
又十个超级有用的PHP代码片段
Sep 24 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
May 16 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
PHP计算近1年的所有月份
Mar 13 PHP
PHP+MySQL实现模糊查询员工信息功能示例
Jun 01 PHP
Cookie跨域问题解决方案代码示例
Nov 24 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中路径问题的解决方案
2006/10/09 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
详解Python3的TFTP文件传输
2018/06/26 Python
pandas计数 value_counts()的使用
2019/06/24 Python
python 字典操作提取key,value的方法
2019/06/26 Python
python操作excel让工作自动化
2019/08/09 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
python支持多继承吗
2020/06/19 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
工作保证书范文
2014/04/29 职场文书
个人收入证明范本
2014/09/18 职场文书
高中班长竞选稿
2015/11/20 职场文书
2016猴年春节慰问信
2015/11/30 职场文书
五年级数学教学反思
2016/02/16 职场文书
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python