1

我的网站最近经常遇到“500 内部服务器错误”,并且主机建议这个 bundle.css.php 脚本可能是原因...

<?php
ob_start('ob_gzhandler');
header('Content-Type: text/css');
$files = split(",",$_GET['files']);
foreach($files as $key=>$val){
    if(file_exists($val.'.css')){
        include_once($val.'.css');
    }else{
        echo "\n\n/*** File \"$val\" does not exist. ***/\n\n";
    }
}
?>

用我的主人的话来说......

“它试图将所有输出缓冲到 ob_gzhandler 中。它采用了一个非常不安全的在 GET 变量 'files' 中传递的参数列表,然后试图将这些文件包含到输出中。我不确定究竟是什么列表正在传递参数,但我怀疑您的脚本中某处存在错误,它将大量文件名传递给该脚本,因此试图构建一个太大的缓冲对象。”

这远远超出了我的专业知识,因此任何解决问题的建议都将不胜感激。非常感谢。


更新

错误日志充满了诸如...之类的行

[Mon Apr 23 15:44:41 2012] [error] [client xx.xx.xx.xx] (12)无法分配内存:无法创建子进程:/opt/suphp/sbin/suphp for /home/ xxxxxy/public_html/xxxx.php,引用者:http ://www.xxxxxxx.com/wp-content/themes/xxx/style.css

4

2 回答 2

0

这里要考虑多点,从对代码的解释开始:

您正在启动 gzip 输出缓冲处理程序,发出Content-Type: text/css标头,用逗号分隔 GET 表单参数的内容,循环遍历结果数组中的每个元素,包括必要的每个文件或发出 CSS 注释作为日志记录字符串。

您的 PHP 进程很可能没有足够的内存来同时处理输出缓冲和压缩。您的主机也可能有一个应用层防火墙来防止这种情况(有充分理由的类似 mod_security),或者您的 PHP 也可能不支持 GZIP 输出缓冲。

这个脚本是一个巨大的安全漏洞!您可以通过更改表单参数使运行此代码的 Web 服务器从运行它的服务器转储任意文件!不要在生产中使用它!曾经!如果你不明白自己在做什么,或者它“超出了你的专业知识”,你现在应该停止编码并找到一份新工作。

于 2012-04-23T16:57:51.713 回答
0

为了让这个脚本更安全一些,你应该检查 $_GET 变量是否使用 isset 函数设置,第二你不应该让用户访问你正在使用的变量,因为如果可以的话,很容易将恶意代码注入其中改用 $_POST 或至少检查 $_GET 变量中传递的值是否是字母数字。

于 2013-03-12T16:07:23.293 回答