PHP中由于fwrite()创建的文件中的include()问题

时间:2009-11-21 00:54:36

标签: php permissions include php4 fwrite

我有一个名为generator.php的文件,它使用fwrite()在服务器上创建result.php(Apache,PHP4)。

result.php中的一行是PHP include()语句。

所以,在generator.php

if (!is_file($fname)){
    $resultfile = fopen($current_path . "/" . $fname, "w+");
}
fwrite($resultfile, '<?php include($_SERVER["DOCUMENT_ROOT"] . "'. '/inc/footer.php"); ?>' . "\n");
fclose($resultfile);
chmod($current_path . "/" . $fname, 0755);  

result.php

<h2>Sponsored Links</h2>
<!-- begin sidebar_top ad -->
<?php echo $_SERVER['DOCUMENT_ROOT'] . "/ads/sidebar_top.php" . "<hr />";
  include($_SERVER['DOCUMENT_ROOT'] . "/ads/sidebar_top.php"); ?>
<!-- end sidebar_top ad -->

但是,当我在浏览器中访问include()时,result.php语句不起作用。 echo语句确实如此,所以我知道路径是正确的。

使用相同代码的另一个test.php,我使用FTP上传到同一个文件夹,工作正常。

通过FTP恢复时,两个文件中的代码相同。

test.php :(有效,回应并正确包含。)

<?php 
echo $_SERVER['DOCUMENT_ROOT'] . "/ads/sidebar_top.php" . "<hr />";
include($_SERVER['DOCUMENT_ROOT'] . "/ads/sidebar_top.php"); 
?> 

include()(手动创建)而不是test.php(使用result.php创建)中,当fwrite()处于同一文件夹中时,我们知道为什么result.php正在工作?

我知道文件之间的唯一区别:

  1. 所有者可能不同(用户nobody不会0775创建?)
  2. 权限原本不同。 FTP文件(工作)为664,而使用fwrite()(包括不工作)创建的文件为generator.php,并由0775test.php进行编码
  3. 使用Smultron在Mac上编辑了工作result.php文件,并通过FTP上传,fwrite()generator.php在Linux上的{{1}}中创建,从浏览器调用。

2 个答案:

答案 0 :(得分:0)

fwrite($resultfile, '<?php include($_SERVER["DOCUMENT_ROOT"] . "/inc/footer.php"); ?>' . "\n");

你有一个额外的“在那里我认为

答案 1 :(得分:0)

当启用PHP4安全模式时,由另一个uid写入的result.php无法访问属于另一个uid的包含文件。

  

安全模式限制有效。 uid为48的脚本不允许访问   uid 10010拥有/var/www/vhosts/example.com/httpdocs/ads/sidebar_top.php   在第130行的/var/www/vhosts/example.com/httpdocs/results/result.php

我通过打开php.ini并更改为safe_mode_gid = On并将我的包含目录添加到safe_mode_include_dir来解决此问题。

我还必须重新启动Apache才能让更改生效。