除客户端 IP 外,基于“X-Forwarded-For”或类似 HTTP 标头识别客户端的好处

信息安全 Web应用程序 tls 网页浏览器 网络服务器 http
2021-09-04 04:45:17

一些 HTTP 代理使用X-Forwarded-For标头来识别客户端的 IP 地址。wiki 页面(上面链接)提到 ISP 也可能使用此标头。

此外,还有多种附加标头可用于识别客户端。一些例子包括:

  • HTTP_CLIENT_IP
  • HTTP_X_FORWARDED_FOR 可以是逗号分隔的 IP 列表
  • HTTP_X_FORWARDED
  • HTTP_X_CLUSTER_CLIENT_IP
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED
  1. 我可以使用这些标头中的任何一个来进行访问控制、阻止或允许访问我的网站吗?
    例如,以升级方式阻止:HTTP_Header_X 先是客户端 IP?

  2. 这些标头的已知用途是什么?例如 ISP、Squid 等代理软件等。

然后我在考虑一些 Web 服务器可能会根据这些标头的存在(或缺乏)动态地改变它们的响应。假设服务器按 IP 地址禁止用户。它应该根据收到的 IP 还是在此标头中指定的 IP 禁止用户?然后,我考虑了欺骗此标头的可能性,以解决服务器可能施加的 IP 禁令。

  1. 这些标头可能存在哪些安全问题,解决它的适当方法是什么?
    例如包括与日志记录等相关的内容。
4个回答

这些 HTTP 标头中的任何一个可以用于访问控制目的,但是我不会依赖这些标头的存在或它们的数据的有效性。

我最常使用它们的是日志记录。无法保证这些标头中的任何一个都将存在,或者即使它们存在,它们也不能保证它们将包含有效数据。我知道有适用于 Firefox 的 X-Forwarded-For 恶搞插件,也可能适用于其他浏览器。这使得信息仅在统计级别有用——趋势、模式分析等,收集和记录这些标题肯定有一些价值。只是不要做任何依赖他们的事情

任何类型的身份验证或访问控制对 HTTP 标头的任何依赖都必须归类为最坏实践行为。

有更好的方法来控制访问和身份验证。

当黑客侵入您的网站时,他们会尝试通过代理来隐藏其来源。这些代理中的大多数都添加了这些标头之一。通过记录这些标头,您更有可能发现来源。

例如,两年前,一名黑客使用开放代理将气候研究人员窃取的电子邮件发布到怀疑论者的网站。如果这些网站跟踪了这些标头,他们可能已经能够发现黑客的身份。

X-Forwarded-For: 标头可以由客户端添加,无论它是否经过代理。一个简单的curl -H "X-Forwarded-For: 127.0.0.1" http://example.com就可以实现这一点。

可以将代理配置为删除此标头,以便为最终用户提供额外的隐私。许多公开的代理都宣传他们这样做。

尽管您可以检查在逗号分隔列表中找到的所有IP 地址并根据其中任何一个来阻止或允许访问,但以上两点意味着任何客户端完全更改这些标头并不困难。访问控制将不可靠。

维护所有已知匿名代理服务器的列表是一项艰巨且最终徒劳的任务。

你会从这样做中获得任何好处吗? 可能。您可能会在短时间内挫败攻击者,直到他找到匿名代理或欺骗自己的标头。这种挫败感可能足以让他转向一个更容易的目标。

有什么缺点吗? 欺骗的标头可能很长,并且可能格式不正确,并且根本不包含任何 IP 地址。同一个标头也可能有多个副本。添加代码来执行所有这些检查可能会引入可能包含安全漏洞的新错误。它还可能导致格式错误、长或多个标头的大量开销。

旁注:如果您使用的是 Apache,mod_rpaf将从多个标头之一中获取最后一个 IP 地址,并用它替换内部 REMOTE_HOST 变量。如果您的 Web 服务器位于反向代理之后,这将非常有用。

这意味着如果您使用 mod_rpaf,Apache 中通过 IP 地址进行的访问控制是不可靠的,并且很容易被规避。

无法保证列表中的最后一个 IP 地址是正确的,或者事实上它们中的任何一个都是正确的。唯一有保证的已知值是您实际连接的 IP 地址。

大部分同意 Ladadada - 这是用户提供的数据,虽然不能保证准确,但至少客户地址更难欺骗。

但是,即使您可以对端点地址有相当的信心,根据请求的 IP 地址对请求进行身份验证也是一个坏主意。

我可以使用这些标头中的任何一个来进行访问控制、阻止或允许访问我的网站吗?

它绝对不应该成为允许访问的标准——但这并不意味着它不是阻止访问的有效标准。毕竟,意图滥用您的网站的人不太可能通过阻止他们访问您的网站的方式获得收益。

确实,如果您希望能够有效地响应拒绝服务攻击,那么基于可疑攻击属性的反馈系统就是要走的路——这就是 fail2ban 所做的。