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 相关文章推荐
PHPShop存在多个安全漏洞
Oct 09 PHP
PHP 数组遍历顺序理解
Sep 09 PHP
PHP 图像尺寸调整代码
May 26 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
Apr 28 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
Sep 06 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
PHP等比例压缩图片的实例代码
Jul 26 PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
关于尾递归的使用详解
2013/05/02 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
vue filters的使用详解
2018/06/11 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
Python反转序列的方法实例分析
2018/03/21 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
python面试题小结附答案实例代码
2019/04/11 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
自荐信怎么写好
2013/11/11 职场文书
新年主持词
2014/03/27 职场文书
大学毕业寄语大全
2014/04/10 职场文书
欢迎标语大全
2014/06/21 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书