![NameVirtualHost 在 HTTP 请求伪造方面的安全性](https://linux22.com/image/607210/NameVirtualHost%20%E5%9C%A8%20HTTP%20%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0%E6%96%B9%E9%9D%A2%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7.png)
如果我正确理解了 NameVirtualHost 的概念,它的工作原理是读取每个 HTTP 请求的 Host 变量,并将其与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) 指令。
- 这些假设正确吗?
- 如果我使用 OAD 保护 VirtualHost,
example.org/phpmyadmin
用户仍然会收到403 Forbidden
错误。我该如何配置 apache 以使其不在非本地主机连接上提供此 VirtualHost?<NameVirtualHost localhost:80>
也许可以单独配置?
答案1
Host:
仅针对正在监听请求所来自的接口/IP 地址的 s 检查标头。VirtualHost
通配符表示虚拟主机可用于来自任何接口的请求。
如果您不希望人们访问localhost
虚拟主机,请明确指定其 IP 地址,而不是允许从所有接口提供服务:
<VirtualHost 127.0.0.1:80 [::1]:80>
ServerName localhost
....
附言:做需要为 localhost 指定 IPv6 地址,因为它是在任何现代系统上使用,并且默认情况下优先于 IPv4。