访问者 IP 的服务器值 - 在此用例中检查哪个?

Posted

技术标签:

【中文标题】访问者 IP 的服务器值 - 在此用例中检查哪个?【英文标题】:Server values for Visitor IP - which to check in this usecase? 【发布时间】:2018-02-16 05:43:47 【问题描述】:

关于这个主题还有其他问题,但我对特定用例感兴趣。

我是一个国家地理定位插件的作者,该插件多年来一直运行良好。已发布问题(可能与 IP 地址相关);但我没有回应提供更多信息的请求。

目前该插件仅从 $_SERVER['REMOTE_ADDR'] 获取 IP 地址,因为:

    它是否包含访问者的“真实”IP 地址或其代理的 IP 地址都无关紧要,因为在大多数合法情况下,它们将是同一个国家/地区。 回应其他 *** qns 声明 $_SERVER['REMOTE_ADDR'] 是唯一“可靠且安全”的值。

但是,当使用反向代理 (nginx) 时,服务器的“REMOTE_ADDR”可能(错误地?)包含本地主机/服务器端 IP。

在这种情况下,我能否确信 $_SERVER['HTTP_X_REAL_IP'] 将包含访问者 IP/他们的代理?

考虑到我对代理服务器的评论,我是否应该修改插件以首先尝试从以下位置获取 IP 地址:

i: 'HTTP_X_REAL_IP' 然后 ii. 'REMOTE_ADDR'

或者我需要进一步扩展吗?例如

i. 'HTTP_CLIENT_IP' 中的第一个 csv; ii. 'HTTP_X_FORWARDED_FOR' 中的第一个 csv; iii. 'HTTP_X_REAL_IP'; iv. 'REMOTE_ADDR'

我认为额外的检查和验证不会对访问任何服务器的访问者产生明显的速度影响?

deceze 回答后的澄清(谢谢):

"默认利用"

它不用于安全性,它会根据访问者国家/地区定制内容。如果有人欺骗地址,他们只会得到内容,例如用于另一个国家的广告。 中毒:互联网依赖于输入表单;我看不出验证环境变量的 IP 是如何像验证评论表单输入那样复杂或有风险的。

注意如果您使用 IP 地址按国家/地区阻止/允许,即使 $_SERVER['REMOTE_ADDR'] 不可靠。当我检查主机时,它包含通过匿名代理或 *** 请求的“中间人”地址(尝试使用 Opera)。可以识别透明代理,但只能通过额外检查“可欺骗”环境变量。

【问题讨论】:

【参考方案1】:

如果 php 在代理之后运行,则完全取决于代理配置是否以及如何传递实际源地址。您不可能预见到人们将使用的所有可能的变量名称,并且您不应该尝试从任意 HTTP 标头中获取值,因为这可能会导致默认情况下被利用。您必须要求插件的服务器管理员/用户明确配置插件应该从哪里获取远程 IP。您只能安全地默认为 $_SERVER['REMOTE_ADDR'],其他任何内容都必须根据特定设置显式配置。

【讨论】:

感谢您的回复:该插件不用于安全性,我已在 qn.xml 中添加了说明。我假设我的理解是正确的?插件位于 Wordpress.org。许多用户不是技术人员。不幸的是,期望这些用户使用未指定的变量名配置插件并设计检查订单规则集是不现实的;并增加了插件的复杂性和风险。也就是说,我已经为我的 qn.xml 中定义的变量考虑了开/关开关。但是,设置中过多的选项可能会令人困惑和令人反感。 即使它对安全性并不重要,如果您默认考虑任意 HTTP 标头的值,这意味着任何人都可以发送这些任意标头并使您的插件无法正常工作。后果有多大,由你自己判断。您可以以各种方式修饰该配置以使其用户友好......向管理员询问诸如“您在使用 CloudFlare 吗?”之类的问题。然后自动为此类服务选择已知配置,并在某处提供“高级...”选项以允许任意配置。

以上是关于访问者 IP 的服务器值 - 在此用例中检查哪个?的主要内容,如果未能解决你的问题,请参考以下文章

将作为varchar存储的数字10与浮点数1.1进行比较,会因算术溢出错误而失败

nodejs如何检查哪个IP访问80端口

BigQuery 通配符表 - 有啥限制?

doOnSuccess 和 doOnEach 之间的区别,以及在哪个用例中我应该使用它们中的每一个

此用例的视图或有机组

使用 Java 反射访问测试用例中的受保护方法