操作系统 Ubuntu Ubuntu 16.04.2 LTS Apache/2.4.18 Perl v5.22.1
所以我有一段 perl 代码,它可以读取 mysql 数据库,然后创建一个动态网页。这段代码多年来一直运行良好。一周前,我的客户打电话说他们收到了一条 500 内部服务器消息。我看了一下,一切似乎都很好,但是当我尝试加载页面时,我收到 500 错误。在 apache 错误日志中,有这个错误:
[Tue May 30 22:16:13.144199 2017] [http:error] [pid 12487] [client 99.99.99.99:55628] AH02429: Response header name '<!-- warning' contains invalid characters, aborting request
有谁见过这种情况吗?或者知道是什么原因造成的吗?
答案1
您的密钥头中包含无效字符,在安全修复 CVE-2016-8743 之前这都不是问题。
https://blog.tigertech.net/posts/apache-cve-2016-8743/
在我的例子中是Apache + PHP并且在“:”之前有一个空格,例如“X-CUSTOM-KEY:”,并且除了更改标题之外我没有找到其他解决方案。
答案2
正如 @GroGz 所说,这个问题几乎肯定是由 CVE-2016-8743 的修复引起的(或者说暴露了)——在 2016 年 12 月 20 日发布的 Apache 更新中,HTTP 标头的解析变得更加严格(详情见https://httpd.apache.org/security/vulnerabilities_24.html)。您的 Perl 脚本可能使用CGI::Carp
包含“warningsToBrowser”子例程的模块。此子例程将代码问题触发的警告放在嵌入在程序输出中的 HTML 注释中,而不仅仅是将它们记录到 HTTPD 日志中。此子例程的触发方式如下:
warningsToBrowser(1);
如果在 HTTP 标头完整发送之前触发它,您将看到类似于您描述的错误。
简单的解决方法是搜索您的代码以查找以下情况:
warningsToBrowser(1);
并将其更改为:
warningsToBrowser(0);
这样,警告消息将仅发送到 STDERR(与大多数 HTTPD 服务器一样,Apache 会将 STDERR 定向到服务器的错误日志)。既然你说“代码多年来一直运行良好”,那么警告可能并不是太严重。请查看http://perldoc.perl.org/5.8.9/CGI/Carp.html#MAKING-WARNINGS-APPEAR-AS-HTML-COMMENTS了解更多信息。
答案3
我遇到了一个有缺陷的 Java 应用程序,它返回“位置:http://foo.bar\n”(请注意,\n
在最后)。
我无法访问应用程序源代码来解决这个问题,所以我不得不采取一种变通方法,告诉 apache 使用以下命令修复标头mod_header
解决方案是:
Header edit Location "\n$" ""
我做了一些测试,创建了一个返回标头的应用程序<!-- warning: teste
,并使用以下指令在 apache 上解决了它:
Header always unset "<!-- warning"
如果您无法修复应用程序,apache 可以为您删除/修复标题。
答案4
问题是由于 symfony 1.4 中有一个空的 header 列表,如下所示
array(1) {
[""] => string(9) "text/html"
}
可以通过将 lib/response/sfWebResponse.class.php 中的第 357 行更改为
foreach ($this->headers as $name => $value)
{
if($name === "")
$name = "Content-type";
header($name.': '.$value);
[...]
实际上我不知道为什么没有设置适当的名称,但是该项目太旧了,无法深入研究框架。