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取得一个类的属性和方法的实现代码
May 22 PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
Jun 20 PHP
PHP实现图片旋转效果实例代码
Oct 01 PHP
ThinkPHP 表单自动验证运用示例
Oct 13 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
Mar 26 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
PHP使用PDO 连接与连接管理操作实例分析
Apr 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
php4的session功能评述(一)
2006/10/09 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
浅析PHP文件下载原理
2014/12/25 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
JSON 编辑器实现代码
2009/12/06 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
详解react-redux插件入门
2018/04/19 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
pandas 数据类型转换的实现
2020/12/29 Python
python中if嵌套命令实例讲解
2021/02/25 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
幼儿园元旦亲子活动方案
2014/02/17 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
先进单位事迹材料
2014/12/25 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
高中美术教学反思
2016/02/17 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
Python 制作自动化翻译工具
2021/04/25 Python
Python+Tkinter打造签名设计工具
2022/04/01 Python