php打开远程文件的方法和风险及解决方法

 更新时间:2013年11月12日 10:40:49   作者:  
本文讲的是php打开远程文件的使用方法,还有使用风险和解决方法
PHP有一个配置选项叫allow_url_fopen,该选项默认是有效的。它允许你指向许多类型的资源,并像本地文件一样处理。例如,通过读取URL你可以取得某一个页面的内容(HTML),看下面的代码
复制代码 代码如下:

<?php
$contents = file_get_contents('https://www.jb51.net/');
?>

当被污染数据用于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中使用redis

    在PHP中使用redis

    这里是在Mac OS上安装redis,并在PHP中开启redis。
    2013-11-11
  • 基于递归实现的php树形菜单代码

    基于递归实现的php树形菜单代码

    这篇文章主要介绍了基于递归实现的php树形菜单代码,采用了递归的方法遍历节点构造出树形菜单,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • PHP 使用二进制保存用户状态的实例

    PHP 使用二进制保存用户状态的实例

    下面小编就为大家分享一篇PHP 使用二进制保存用户状态的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • php 全文搜索和替换的实现代码

    php 全文搜索和替换的实现代码

    方便替换和全文索引
    2008-07-07
  • asp.net和php的区别点总结

    asp.net和php的区别点总结

    在本篇文章里小编给大家分享了关于asp.net和php的区别的相关知识点,需要的朋友们可以分享下。
    2019-10-10
  • 浅谈PHP中Stream(流)

    浅谈PHP中Stream(流)

    Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数。Stream可以翻译为“流”,在Java里,流是一个很重要的概念。
    2015-06-06
  • PHP进阶学习之垃圾回收机制详解

    PHP进阶学习之垃圾回收机制详解

    这篇文章主要介绍了PHP进阶学习之垃圾回收机制,详细分析了php垃圾回收机制的概念、原理及对性能的影响,需要的朋友可以参考下
    2019-06-06
  • 10条php编程小技巧

    10条php编程小技巧

    这篇文章主要介绍了10条php编程小技巧,本文是实际开发经验的总结,注意到了一些编程细节,需要的朋友可以参考下
    2015-07-07
  • PHP使用SOAP调用API操作示例

    PHP使用SOAP调用API操作示例

    这篇文章主要介绍了PHP使用SOAP调用API操作,结合实例形式分析了php基于SOAP调用API的常见操作技巧及相关问题解决方法,需要的朋友可以参考下
    2018-12-12
  • 基于php实现的php代码加密解密类完整实例

    基于php实现的php代码加密解密类完整实例

    这篇文章主要介绍了基于php实现的php代码加密解密类,结合完整实例形式分析了php针对php代码进行加密与解密的完整流程,以及加密解密类的使用方法,需要的朋友可以参考下
    2016-10-10

最新评论