脚本导致500内部服务器错误

时间:2012-04-23 15:58:24

标签: php

我的网站经常遭遇“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] [错误] [client xx.xx.xx.xx](12)无法分配内存:无法创建子进程:/ opt / suphp / sbin / suphp for /home/xxxxxy/public_html/xxxx.php,referer:http://www.xxxxxxx.com/wp-content/themes/xxx/style.css

2 个答案:

答案 0 :(得分:0)

此处需要考虑多个要点,首先是对代码的解释:

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

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

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

答案 1 :(得分:0)

要让这个脚本有点麻烦,你应该检查是否使用isset函数设置了$ _GET变量,第二,你永远不应该让用户访问你正在使用的变量,因为很容易将恶意代码注入其中,如果您可以使用$ _POST代替或至少检查$ _GET变量中传递的值是否为字母数字。