Если я правильно понимаю концепцию NameVirtualHost, он работает, читая переменную Host каждого HTTP-запроса и сопоставляя ее с ServerName
в любой активной директиве VirtualHost с соответствующим интерфейсом и портом. Если он найдет совпадение ServerName
содержимое этого VirtualHost предоставляется клиенту.
Переменная Host может быть легко подделана клиентом. Итак, в следующей конфигурации:
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /super/secret/files
ServerName localhost
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/webserver
ServerName www.example.org
</VirtualHost>
клиент мог просто передать localhost
в качестве значения Host и получите доступ к секретным файлам. Так что нельзя полагаться на ServerName
и нужно использовать Order
,Allow
,Deny
(OAD) директивы.
example.org/phpmyadmin
с OAD пользователь по-прежнему получает 403 Forbidden
ошибка. Как мне настроить apache, чтобы он даже не обслуживал этот VirtualHost на соединениях, отличных от localhost? Отдельный <NameVirtualHost localhost:80>
может быть?В Host:
заголовок проверяется только на VirtualHost
s, которые прослушивают интерфейс / IP-адрес, на который пришел запрос. Подстановочный знак означает, что виртуальный хост может использоваться для запросов из любого интерфейса.
Если вы не хотите, чтобы люди получали доступ к localhost
виртуальный хост, затем явно укажите его IP-адреса, вместо того, чтобы разрешать его обслуживание со всех интерфейсов:
<VirtualHost 127.0.0.1:80 [::1]:80>
ServerName localhost
....
P.S. Вы делать необходимо указать IPv6-адрес для localhost, так как он является используется в любой современной системе и по умолчанию предпочтительнее IPv4.