笔记 by 车东

[安全漏洞] 跨服务器之间的内容同步不能使用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有没有包含其他文件但不执行其中的代码简单函数。代码如下:

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’);了。