Назад | Перейти на главную страницу

При каких сценариях Apache разрешит прохождение несоответствующего HTTP_HOST?

Кому-то удалось пройти неопределенный HTTP_HOST server в скрипт моего приложения, вызывая серию ошибок. Я очень взволнован, но не могу воспроизвести такое поведение. Мой httpd-сервер использует виртуальный хостинг на основе имени со следующими параметрами:

ServerName example.com:80
UseCanonicalName On

<VirtualHost *:80>
  ServerName example.com
  ServerAlias ftp.example.com service.example.com
  ErrorDocument 404 /error/404.html.var
...
</VirtualHost>

<VirtualHost *:80>
  ServerName notfound.example.com
  ServerAlias *
  RedirectMatch 404 ^/(?!error)
  ErrorDocument 404 /error/404.html.var
</VirtualHost>

Я попытался воспроизвести запрос с помощью wget со следующим:

wget -dS --header='Host: ' http://example.com/?x0a/x04/x0a/x04/x06/x08/x09/...
--2014-07-30 03:00:00--  http://example.com/?x0a/x04/x0a/x04/x06/x08/x09/...
Connecting to example.com:80... connected.
---request begin---
GET / HTTP/1.1
Accept: */*
Host: 
Connection: Keep-Alive

---request end---
...
HTTP request sent, awaiting response... 
---response begin--
  HTTP/1.1 404 Not Found
  Date: Wed, 29 Jul 2014 03:00:00 GMT
  Server: Apache
  Accept-Ranges: bytes
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Transfer-Encoding: chunked
  Content-Type: text/html; charset=UTF-8
  Content-Language: en
---response end---
...
2014-07-29 03:00:00 ERROR 404: Not Found.

И, как и следовало ожидать, выдается ошибка 404 not found. Интересно, как кто-то может вызвать 200 успехов с неопределенным HTTP_HOST. Полагается ли ServerAlias ​​в Apache на HTTP_HOST вообще? Или это может быть ошибка сервера, которую кто-то пытается использовать?

ОБНОВИТЬ:

Это результат httpd -S:

VirtualHost configuration:
*:80                   is a NameVirtualHost
         default server example.com (/etc/httpd/conf/httpd.conf:410)
         port 80 namevhost example.com (/etc/httpd/conf/httpd.conf:410)
                 alias localhost
                 alias xxx.xxx.xxx.xxx
                 alias ftp.example.com
                 alias service.example.com
         port 80 namevhost notfound.example.com (/etc/httpd/conf/httpd.conf:491)
                 wild alias *
ServerRoot: "/etc/httpd"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/etc/httpd/logs/error_log"
Mutex default: dir="/run/httpd/" mechanism=default 
Mutex rewrite-map: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
PidFile: "/run/httpd/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="apache" id=48 not_used
Group: name="apache" id=48 not_used

Да, ServerAlias ​​точно работает с HTTP_HOST переменная (вернее, с Host: HTTP-заголовок запроса, который будет сопоставлен с HTTP_HOST также).

Если нет Host: http-заголовок, И request_uri также содержит http-хост (т.е. GET http://example.com/path/to HTTP/1.1), он также будет использоваться как HTTP_HOST. Обычно это происходит только с прокси.

Ваш пример плохой, Хост: не может содержать URL-адрес, только имя хоста. Если кто-то дает здесь URL-адрес (возможно, из-за плохого инструмента http), он будет интерпретирован как недопустимое / несуществующее имя хоста, и именно это происходит в вашем случае.

Практически: хотя я мог бы найти и проанализировать соответствующие части (общедоступного) исходного кода веб-сервера apache, я не думаю, что такие сложные вещи нужны. Лучшее, что вы можете сделать, это поиграть со своим собственным apache с некоторыми telnet 127.0.0.1 80 или аналогичные команды. Укажите разные заголовки GET / url, Host: для вашего виртуального хоста apache и посмотрите, что произойдет. Это то, что я делал много раз, когда мне нужно было отлаживать конфигурации виртуального хоста apache. Минимальный пример http-запроса на основе telnet находится здесь:

$ telnet 127.0.0.1 80
GET /test/url.html HTTP/1.1
Host: myapache.mydomain.com
Connection: close

(me: until this you need to type in, don't forget the multiple enter at the end)
200 HTTP/1.1 OK (<- me: from here is coming the reply of the server!)
Content-type: html/html

<html> 
...
</html>