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下统计用户在线时间的一种尝试
Aug 26 PHP
php在程序中将网页生成word文档并提供下载的代码
Oct 09 PHP
克隆一个新项目的快捷方式
Apr 10 PHP
Php header()函数语法及使用代码
Nov 04 PHP
PHP图片裁剪函数(保持图像不变形)
May 04 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP生成图片缩略图类示例
Jan 12 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
PHP实时统计中文字数和区别
Feb 28 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
Sep 03 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 根据IP地址控制访问的代码
2010/04/22 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
javascript动画浅析
2012/08/30 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
实现js保留小数点后N位的代码
2014/11/13 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
python selenium firefox使用详解
2019/02/26 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
打造高效课堂实施方案
2014/03/22 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
详解Go语言中Get/Post请求测试
2022/06/01 Golang