防止HTTP HOST标头攻击(防止您的网站认为是其他人)
Drupal 7在核心中添加了一个新功能,而不是直接面向用户,但有时也称为穷人的cron。该功能触发Drupal站点的周期性任务,如清空日志文件,发送电子邮件和清除缓存。此功能与动态检测“基本URL”(在Drupal 4.7中添加)结合使用时,可能会导致一些棘手的情况。本文描述了某些模块或两者都出现的一些棘手情况,以及您可以采取哪些措施来防止它们。下面的评论假设一些默认配置 - 我将在最后讨论如何摆脱这些默认配置以防止这些问题。
方案1:获取/发送看似用于其他域的用户电子邮件
这种行为很容易复制:
- 将新域指向现有站点的IP - 让我们调用现有站点http://www.example.com,并指向该IP的新名称为http://other-site.example.org
- 访问网址:http://other-site.example.org/user/password
- 提交可能在网站上使用的用户名。
结果是,在第2步中,$ base_url检测认为您的站点是http://other-site.example.org以及包含[user:one-time-login-url]等电子邮件的所有令牌您网站的链接将更改为使用http://other-site.example.org作为基本网址。收到此电子邮件的用户将看到他们的用户名和example.com的电子邮件现在在http://other-site.example.org上以某种方式使用,这通常只是令人困惑。但是,可能会出现两个不好的情况:
- 在最糟糕的情况下,可能会导致他们点击密码重置链接,恶意网站可以使用该链接以该用户身份登录该网站。
- 他们可能会将他们的用户名/密码输入http://other-site.example.org--一种所谓的社会工程攻击 - 然后可以在主站点上使用。
方案2:缓存包含错误域的条目
当用户使用错误的域来发出请求时,可能会发生类似的问题,而这恰好是使用动态的完全限定域填充缓存条目的请求。从该缓存中检索信息的后续访问将获得错误的域名。Drupal核心的页面缓存使用域作为缓存ID的一部分,防止出现此问题,但其他缓存机制可能不会对此问题具有强大的功能。
场景3:包含错误域的通知邮件
在使用在cron运行期间发送电子邮件的模块的站点上可能会出现另一个问题。这种情况需要穷人的cron与动态base_url检测。如果用户碰巧通过访问错误的域名在队列中发出通知时触发了穷人的cron,则会通过该错误的域发送通知。用户将非常困惑为什么他们希望从example.com的电子邮件地址收到的邮件包含指向http://other-site.example.org域的链接。
使用Drupal动态base_url检测混淆体验的解决方案
这个问题至少有四种可能的解决方案,但并非所有这些都是解决问题的必要条件。您应该根据您的环境挑选。
- 您可以在sites / default / settings.php中将特定域设置为$ base_url。虽然动态检测可以是一个方便的功能,但它也可能导致问题。阻止它的一种方法就是设置永久值。
- 使用特定的sites / example.com / settings.php并动态检测$ base_url - 这意味着让Drupal响应example.com的所有子域,这可能是一个好处,也可能不是。
- 配置您的Web服务器,以便在传入请求不是您的默认Drupal安装之外(例如错误页面)时提供默认页面。
- 将您的网络服务器配置为重定向到达您的服务器但不适合相应域的所有请求转发到正确的域名。
Drupal 8中的可信主机安全设置
截至2015年1月,Drupal 8支持“可信主机模式”,您可以(并且应该)指定传入请求中的域必须匹配的一组正则表达式。示例配置将读取:settings.php
$settings['trusted_host_patterns'] = [
'^www\.example\.com$',
];
有关详细信息,请参阅上述更改记录。请注意,如果您正在进行本地开发,则可能会通过上述配置自行(暂时)锁定您的站点。您应该添加信任的主图案为'^localhost$'
在这种情况下。
MAMP 3的可信主机设置
关于本地开发,MAMP(3.5.2)'^ localhost $'设置给出错误消息“提供的主机名对此服务器无效”,并且不加载站点。找到一个解决方案,用站点名称更改它,没有端口号。在我的测试网站“drupal8”中:
$settings['trusted_host_patterns'] = [
'^drupal8$',
];
使可信主机处于活动状态。
注意:在MAMP 4.2'^ localhost $'工作得很好。
Acquia Dev Desktop 2的可信主机设置(使用Drupal 8.6.2和PHP 7.2.8测试)
如果您使用的是Acquia Dev Desktop 2,请尝试以下可信主机模式。将“sitename”更改为您网站的名称:
$settings['trusted_host_patterns'] = array(
'^sitename\.dd$',
);
XAMPP的可信主机设置(使用Drupal 8.4.0和PHP 7.1.8测试)
要启用可信主机机制,我们需要在$ settings ['trusted_host_patterns']中启用允许的主机。
打开“settings.php”文件并更新以下代码以启用可信主机设置:
$settings['trusted_host_patterns'] = [
'^localhost$',
'^192\.168\.00\.52$',
'^127\.0\.0\.1$',
];
这里,
- '^ localhost $',:这将允许该站点仅从localhost运行。
- '^ 192 \ .168 \ .00 \ .52 $',:这将允许站点仅从系统IP运行(不同的系统具有不同的IP)。
- '^ 127 \ .0 \ .0 \ .1 $',:这将允许该站点仅从127.0.0.1而不是localhost运行。
注意:如果有人运行多站点,那么在这种情况下只需指定站点允许的所有主机模式。
评论