在什麼情況下 Apache 會允許不匹配的 HTTP_HOST 通過?
有人設法將未定義的
HTTP_HOST
伺服器變數傳遞給我的應用程序腳本,從而觸發了一系列錯誤。我很不安,但無法複製這種行為。我的 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 錯誤被傳遞。我想知道如何使用未定義的 HTTP_HOST 觸發 200 成功。Apache 中的 ServerAlias 是否完全依賴 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。這通常僅在代理的情況下發生。您的範例很糟糕, Host: 不能包含 url,只能包含主機名。如果有人在此處提供了一個 url(可能是由錯誤的 http 工具提供),它將被解釋為無效/不存在的主機名,這就是您的情況。
實際:雖然我們可以找到並分析 apache webserver 的(公共)原始碼的相關部分,但我認為不需要這麼難的東西。您能做的最好的事情就是使用一些
telnet 127.0.0.1 80
或類似的命令來使用您自己的 apache。為您的虛擬主機 apache 提供不同的 GET /url, Host: 標頭,看看會發生什麼。當我需要調試虛擬主機的 apache 配置時,我經常這樣做。一個基於 telnet 的 http 查詢 minimumexample 在這裡:$ 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>