ОС 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
Кто-нибудь видел это или имеет какое-либо представление о причинах этого?
У вас есть заголовок ключа с недопустимыми символами, это не было проблемой до исправления системы безопасности CVE-2016-8743.
https://blog.tigertech.net/posts/apache-cve-2016-8743/
В моем случае это был Apache + PHP и пробел перед ":", например "X-CUSTOM-KEY:", и я не нашел другого решения, кроме изменения заголовка.
У меня была эта проблема с java-приложением с ошибками, которое возвращало «Местоположение: http://foo.bar\ n "(обратите внимание, что \n
в конце).
У меня не было доступа к исходному коду приложения для решения проблемы, поэтому мне пришлось найти обходной путь, сказав apache исправить заголовки, используя mod_header
Решение было:
Header edit Location "\n$" ""
Провел несколько тестов, создал приложение, которое вернуло <!-- warning: teste
заголовок и решил его на apache с помощью следующей директивы:
Header always unset "<!-- warning"
Если вы не можете исправить приложение, apache может удалить / исправить заголовок за вас.
Как сообщает @GroGz, эта проблема почти наверняка вызвана (или, скорее, обнаружена) исправлением CVE-2016-8743 - синтаксический анализ заголовков HTTP стал гораздо более строгим в обновлении Apache, выпущенном 20 декабря 2016 г. (подробности см. 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 для получения дополнительной информации.
Проблема возникает из-за пустого списка заголовков, который в symfony 1.4 выглядит как
array(1) {
[""] => string(9) "text/html"
}
Проблему можно решить, изменив строку 357 в lib / response / sfWebResponse.class.php на
foreach ($this->headers as $name => $value)
{
if($name === "")
$name = "Content-type";
header($name.': '.$value);
[...]
На самом деле я не знаю, почему не указано собственное имя, но проект слишком стар, чтобы копаться в фреймворке.