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 相关文章推荐
1.PHP简介
Oct 09 PHP
桌面中心(二)数据库写入
Oct 09 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
PHP自定义函数收代码
Aug 01 PHP
PHP中输出转义JavaScript代码的实现代码
Apr 22 PHP
php数组函数序列之array_search()- 按元素值返回键名
Nov 04 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
反射调用private方法实践(php、java)
Dec 21 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
详解php与ethereum客户端交互
Apr 28 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 PHP
Laravel如何同时连接多个数据库详解
Aug 13 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 图片上添加透明度渐变的效果
2009/06/29 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
jQuery 学习 几种常用方法
2009/06/11 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
js运动事件函数详解
2016/10/21 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
python使用pil生成图片验证码的方法
2015/05/08 Python
python使用matplotlib绘制热图
2018/11/07 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
天巡全球:Skyscanner Global
2017/06/20 全球购物
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
高中生班主任评语
2014/04/25 职场文书
师德师风承诺书
2014/05/23 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
中学教师个人总结
2015/02/10 职场文书
小学中队长竞选稿
2015/11/20 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript