[安全漏洞] 跨服务器之间的内容同步不能使用php的include/require函数


前2天读到了? RSS阅读中潜在的安全问题 | 未完成 - Incomplete,讲的是混杂在Rich Text的RSS中的js会在RSS阅读客户端执行从而导致潜在的漏洞问题。正巧我在上个周末的时候也遇到了类似的一个问题:不过更严重的是在RSS聚合的服务器端。
我的首页是用require_once('lilina.html') 的方式包含一个lilina.php生成的静态页面组合生成的,源代码如下。其中也包含了跨服务器PHP脚本执行的安全漏洞。如果我订阅的RSS中有黑客将其中混入 <?php >这样的代码,这样一包含:不就可以直接在我的服务器上直接运行php脚本了吗?这个潜在漏洞的发现还是从MSN的Search blog的一篇FEED中引出的。

上周日的问题是这样的:周日上午我忽然发现自己的blog中间require的部分无法显示了,调查了一个上午
原来php新版本中缺省将display_error关闭了,程序遇到错误只会停止执行,需要在需要显示错误信息的php页面中设置: ini_set('display_error', true); 才会正常显示错误。我另外做了一个test.php 显示了一下:发现是某行上除了php 解析错误。定位过去才看到原来是MSN的Search blog的一篇上有一个 <?标记,被require_once后,于是后面的html代码被当作php代码:当作php脚本的开始执行了,当然错误很多。开始想先将<?这样的标记禁掉通过设置php.ini中的short_open_tag = Off,但这样治标不治本,而且还导致了更多的php代码泄漏。正确的方法是包含一个静态文件时:使用fopen然后一行一行的buffer print出来,这样就不会执行远程文件中可能的php代码了,不知道PHP有没有包含其他文件但不执行其中的代码简单函数。代码如下:

$filename = "lilina.html";
$dataFile = fopen( $filename, "r" );

if ( $dataFile ) {
while (!feof($dataFile))
{
$buffer = fgets($dataFile, 4096);
echo $buffer;
}
fclose($dataFile);
} else {
die( "fopen failed for $filename" );
}

后记:
谢谢 Zheng Kai: 我已经改用 file_get_contents('lilina.html');了。

作者:车东 发表于:2005-10-26 09:10 最后更新于:2010-08-08 10:08
版权声明:可以转载,转载时请务必以超链接形式标明文章 的原始出处和作者信息及本版权声明

Comments

老大啊!你怎么可以犯这么低级的错误……用 file_get_contents 啊!不要用 fopen 什么的,你已经落伍了……

file_get_contents (PHP 4.3 新增函数)可以读任意 URL,本地、远程,甚至不用考虑读的是 https 还是 ftp

http://cn.php.net/manual/zh/ref.stream.php
见 例子 1

ini_set("display_error",true);也行吗?
我一直都是
ini_set("display_errors","On");

跨站的问题屡见不鲜,感觉追根究底都还是程序的问题……

可以参看include.另外如果可能的话可以修改php.ini的配置来禁止require等远程包含文件。出于安全考虑,没有特殊情况都会禁掉的,因为远程的未知性和不可检测性。

怪不得那天空白了
车东老大还会犯这么土的错误啊
呵呵

恩,又了解了一些东西

发表一个评论

(如果你此前从未在此 Blog 上发表过评论,则你的评论必须在 Blog 主人验证后才能显示,请你耐心等候。)