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 相关文章推荐
有关PHP中MVC的开发经验分享
May 17 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
PHP开发框架kohana中处理ajax请求的例子
Jul 14 PHP
php中opendir函数用法实例
Nov 15 PHP
PHP程序员必须清楚的问题汇总
Dec 18 PHP
php利用scws实现mysql全文搜索功能的方法
Dec 25 PHP
深入理解PHP中的Streams工具
Jul 03 PHP
CodeIgniter配置之autoload.php自动加载用法分析
Jan 20 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
PHP微信支付开发实例
Jun 22 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 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 session常见问题集锦及解决办法总结
2007/03/18 PHP
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
2012/02/10 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
webpack+react+antd脚手架优化的方法
2018/04/02 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python3网络爬虫中的requests高级用法详解
2019/06/18 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
学校学雷锋活动总结
2014/06/26 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL