加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-12 19:57:45 所属栏目:PHP教程 来源:网络整理
导读:PHP有一个配置选项叫allow_url_fopen,该选项默认是有效的。它允许你指向许多类型的资源,并像本地文件一样处理。例如,通过读取URL你可以取得某一个页面的内容(HTML),看下面的代码 div class="codetitle" a style="CURSOR: pointer" data="83510" class="

PHP有一个配置选项叫allow_url_fopen,该选项默认是有效的。它允许你指向许多类型的资源,并像本地文件一样处理。例如,通过读取URL你可以取得某一个页面的内容(HTML),看下面的代码
<div class="codetitle"><a style="CURSOR: pointer" data="83510" class="copybut" id="copybut83510" onclick="doCopy('code83510')"> 代码如下:<div class="codebody" id="code83510">
<?php
$contents = file_get_contents('//www.52php.cn/');
?>

当被污染数据用于include和require的文件指向时,会产生严重漏洞。实际上,我认为这种漏洞是中最危险的漏洞之一,这是因为它允许攻击者执行任意代码。尽管严重性在级别上要差一点,但在一个标准文件系统函数中使用了被污染数据的话,会有类似的漏洞产生:
<div class="codetitle"><a style="CURSOR: pointer" data="75225" class="copybut" id="copybut75225" onclick="doCopy('code75225')"> 代码如下:<div class="codebody" id="code75225">
<?php
$contents = file_get_contents($_GET['filename']);
?>

该例使用户能操纵file_get_contents( )的行为,以使它获取远程资源的内容。考虑一下类似下面的请求:
http://example.org/file.php?file ... mple.org%2Fxss.html
这就导致了$content的值被污染的情形,由于这个值是通过间接方式得到的,因此很可能会忽视这个事实。这也是深度防范原则会视文件系统为远程的数据源,同时会视$content的值为输入,这样你的过滤机制会潜在的起到扭转乾坤的作用。
由于$content值是被污染的,它可能导致多种安全漏洞,包括跨站脚本漏洞和SQL注入漏洞。例如,下面是跨站脚本漏洞的示例:
<div class="codetitle"><a style="CURSOR: pointer" data="53198" class="copybut" id="copybut53198" onclick="doCopy('code53198')"> 代码如下:<div class="codebody" id="code53198">
<?php
$contents = file_get_contents($_GET['filename']);
echo $contents;
?>

解决方案

是永远不要用被污染的数据去指向一个文件名。要坚持过滤输入,同时确信在数据指向一个文件名之前被过滤即可:
<div class="codetitle"><a style="CURSOR: pointer" data="92719" class="copybut" id="copybut92719" onclick="doCopy('code92719')"> 代码如下:<div class="codebody" id="code92719">
<?php
$clean = array();
/ Filter Input ($_GET['filename']) /
$contents = file_get_contents($clean['filename']);
?>

尽管无法保证$content中的数据完全没有问题,但这还是给出了一个合理的保证,即你读取的文件正是你想要读取的文件,而不是由攻击者指定的。为加强这个流程的安全性,你同样需要把$content看成是输入,并在使用前对它进行过滤。
<div class="codetitle"><a style="CURSOR: pointer" data="74156" class="copybut" id="copybut74156" onclick="doCopy('code74156')"> 代码如下:<div class="codebody" id="code74156">
<?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'];
?>

上面的流程提供了防范多种攻击的强有力的方法,同时在实际编程中推荐使用。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读