Кому-то удалось пройти неопределенный 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>