NameVirtualHost关于HTTP请求伪造的安全性

如果我正确理解NameVirtualHost的概念,它将通过读取每个HTTP请求的Hostvariables并将其与匹配接口和端口的任何活动VirtualHost指令中的ServerName匹配。 如果发现一个匹配的ServerName ,则将该VirtualHost的内容提供给客户端。

主机variables可以很容易被客户伪造。 所以在以下configuration中:

 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并且必须使用OrderAllowDeny (OAD)指令。

  1. 这些假设是正确的吗?
  2. 如果我用OAD保护VirtualHost example.org/phpmyadmin ,用户仍然得到403 Forbidden错误。 我将如何configurationApache甚至不在非本地主机连接上提供此VirtualHost? 一个单独的<NameVirtualHost localhost:80>也许?

Host:头只检查VirtualHost Host:是侦听接口/ IP地址请求进来。 通配符意味着虚拟主机可以用于来自任何接口的请求。

如果您不希望人们访问localhost虚拟主机,请明确指定其IP地址,而不是允许其从所有接口提供服务:

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

PS您需要为本地主机指定IPv6地址,因为它在任何现代系统上都正在使用,默认情况下优先于IPv4。