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

Безопасность NameVirtualHost в отношении подделки HTTP-запросов

Если я правильно понимаю концепцию 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) директивы.

  1. Верны ли эти предположения?
  2. Если я защищу VirtualHost example.org/phpmyadmin с OAD пользователь по-прежнему получает 403 Forbidden ошибка. Как мне настроить apache, чтобы он даже не обслуживал этот VirtualHost на соединениях, отличных от localhost? Отдельный <NameVirtualHost localhost:80> может быть?

В Host: заголовок проверяется только на VirtualHosts, которые прослушивают интерфейс / IP-адрес, на который пришел запрос. Подстановочный знак означает, что виртуальный хост может использоваться для запросов из любого интерфейса.

Если вы не хотите, чтобы люди получали доступ к localhost виртуальный хост, затем явно укажите его IP-адреса, вместо того, чтобы разрешать его обслуживание со всех интерфейсов:

<VirtualHost 127.0.0.1:80 [::1]:80>
    ServerName localhost
    ....

P.S. Вы делать необходимо указать IPv6-адрес для localhost, так как он является используется в любой современной системе и по умолчанию предпочтительнее IPv4.