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 相关文章推荐
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
Jul 09 PHP
怎样在UNIX系统下安装MySQL
Oct 09 PHP
php 中文和编码判断代码
May 16 PHP
php中的三元运算符使用说明
Jul 03 PHP
PHP中如何定义和使用常量
Feb 28 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 PHP
PHP eval函数使用介绍
Dec 08 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
php猜单词游戏
Sep 29 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
Oct 11 PHP
PHP内存溢出优化代码详解
Feb 26 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
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
js玩一玩WSH吧
2007/02/23 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
关于query Javascript CSS Selector engine
2013/04/12 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
js canvas仿支付宝芝麻信用分仪表盘
2016/11/16 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
python实现图片批量剪切示例
2014/03/25 Python
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
python 编写简单网页服务器的实例
2018/06/01 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
python机器学习库xgboost的使用
2020/01/20 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
python实现逻辑回归的示例
2020/10/09 Python
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
2014年党课学习心得体会
2014/07/08 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
志愿者工作心得体会
2016/01/15 职场文书
2016年母亲节广告语
2016/01/28 职场文书
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server