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 mongodb扩展时 需要注意的事项
Jun 18 PHP
浅析echo(),print(),print_r(),return之间的区别
Nov 27 PHP
php 获取页面中指定内容的实现类
Jan 23 PHP
php实现文件下载功能的几个代码分享
May 10 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
php文件上传简单实现方法
Jan 24 PHP
php使用socket post数据到其它web服务器的方法
Jun 02 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
RSA实现JS前端加密与PHP后端解密功能示例
Aug 05 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
Apr 20 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中static关键字原理的学习研究分析
2011/07/18 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
header导出Excel应用示例
2014/01/24 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
php检测url是否存在的方法
2015/04/14 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
php生成HTML文件的类方法
2019/10/11 PHP
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
JavaScript获取页面中表单(form)数量的方法
2015/04/03 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
基于jQuery实现的单行公告活动轮播效果
2017/08/23 jQuery
React Native 截屏组件的示例代码
2017/12/06 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
工商企业管理应届生求职信
2013/11/03 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
党员民主生活会材料
2014/12/15 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
创业方案:赚钱的烧烤店该怎样做?
2019/07/05 职场文书
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python