唯一安全的方法
此页面上的所有其他答案都具有安全隐患,您需要注意这些隐患。
检索当前域的唯一有保证的安全方法
是𝓼𝓽𝓸𝓻𝓮𝓲𝓽𝓪𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯。
大多数框架都会为您存储域,因此您将需要查阅特定框架的文档。如果不使用框架,请考虑将域存储在以下位置之一:
+ ------------------------------------------------- --- + ----------------------------------- +
| 存储域的安全方法| 使用者|
+ ------------------------------------------------- --- + ----------------------------------- +
| 配置文件| Joomla,Drupal / Symfony |
| 数据库| WordPress |
| 环境变量| Laravel |
| 服务注册表| Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +
您可以使用以下内容...但是它们不安全
黑客可以使这些变量输出所需的任何域。这可能导致缓存中毒和几乎没有注意到的网络钓鱼攻击。
$_SERVER['HTTP_HOST']
这是从请求标头获取域的,请求标头可以被黑客操纵。与:
$_SERVER['SERVER_NAME']
如果关闭Apache设置usecanonicalname,可以使这一方法更好。在这种情况下,$_SERVER['SERVER_NAME']
将不再允许使用任意值进行填充,并且这种方法是安全的。但是,这不是默认设置,在设置中并不常见。
在流行的系统中
以下是如何在以下框架/系统中获得当前域的方法:
WordPress的
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
如果要在WordPress中构造URL,则只需使用home_url或site_url或任何其他URL函数。
拉拉韦尔
request()->getHost()
该request()->getHost
功能继承自Symfony,自对2013 CVE-2013-4752进行修补以来一直安全。
Drupal
安装程序尚未确保此安全(发行#2404259)。但是在Drupal 8中有文档,您可以在Trusted Host Settings中遵循这些文档来保护您的Drupal安装,之后可以使用以下内容:
\Drupal::request()->getHost();
其他框架
随意编辑此答案以包括如何在您喜欢的框架中获取当前域。这样做时,请提供指向相关源代码或其他任何链接的链接,这些链接将帮助我验证框架是否在安全地执行操作。
附录
开发示例:
如果僵尸网络不断使用错误的主机头请求页面,则会发生缓存中毒。然后,生成的HTML将包含指向攻击者网站的链接,攻击者可以在其中诱骗您的用户。最初,恶意链接只会发送回给黑客,但是,如果黑客发出了足够的请求,则该页面的恶意版本将最终出现在您的缓存中,并将其分发给其他用户。
如果您基于主机头将链接存储在数据库中,则可能会发生网络钓鱼攻击。例如,假设您将绝对URL存储到论坛上用户的个人资料中。通过使用错误的标头,黑客可以使单击其个人资料链接的任何人都被发送到钓鱼网站。
如果黑客在为其他用户填写密码重置表单时使用恶意主机头,则会发生密码重置中毒。然后,该用户将收到一封电子邮件,其中包含通向钓鱼网站的密码重置链接。
这是一些恶意示例
其他注意事项和注意事项:
- 关闭usecanonicalname时,无论如何都将
$_SERVER['SERVER_NAME']
使用相同的标头填充该标头$_SERVER['HTTP_HOST']
(加上端口)。这是Apache的默认设置。如果您或开发人员启用了此功能,那么您会没事-ish-但您是否真的想依靠一个单独的团队,或者自己未来三年,以保持看起来像是次要的配置? -默认值?即使这样做可以确保安全,但我还是提醒不要依赖此设置。
- 但是,Redhat确实默认情况下会启用usecanonical [ source ]。
- 如果在虚拟主机条目中使用serverAlias,并且请求了别名域,
$_SERVER['SERVER_NAME']
则不会返回当前域,但会返回serverName指令的值。
- 如果无法解析serverName,则在其位置[source]处使用操作系统的hostname命令。
- 如果省略了主机头,则服务器将表现为useuseonical位于[source]上。
- 最后,我只是尝试在本地服务器上利用此漏洞,但无法欺骗主机头。我不确定Apache是否有解决此问题的更新,或者我做错了什么。无论如何,在不使用虚拟主机的环境中,仍可以利用此头。
小兰特:
这个问题得到了成千上万的观点,而没有提到手头的安全问题!不应该这样,只是因为Stack Overflow答案很流行,这并不意味着它是安全的。