如果Request.ServerVariables"HTTP_X_FORWARDED_FOR“返回多个ip,我应该取哪一个,在c#中该怎么做?我的理解是,如果它是空的或空的,那么客户端计算机不会通过代理,我可以直接从Request.ServerVariables"REMOTE_ADDR“获取它们的ip。这是一个正确的说法吗?
所谓“我取哪一个”,我的意思是我取列表中的第一个IP还是最后一个IP,我所要做的就是把它分成一个数组,然后取我想要的那个。我不太确定HTTP_X_FORWARDED_FOR是如何工作的。
发布于 2009-04-15 21:25:54
根据this,X-Forwarded-For HTTP header的格式为:
X-Forwarded-For: client1, proxy1, proxy2, ...因此,您想要的客户端的IP地址应该是列表中的第一个
发布于 2009-06-24 05:55:07
关于可靠性主题的进一步说明:
任何人都可以通过使用诸如Firefox插件“篡改数据”或他们自己的本地代理(例如Privoxy)之类的工具来伪造HTTP_X_FORWARDED_FOR。这意味着整个字符串可能是假的,而REMOTE_ADDR是实际的原始主机。这也可能意味着第一个"client1“地址是伪造的,然后客户端通过代理连接,导致proxy1是客户端的IP地址,而REMOTE_ADDR是使用的单一代理。
如果你想拒绝基于IP的访问,我建议检查XFF头和REMOTE_ADDR中的每个IP地址。
如果您希望根据IP的区域授予访问权限,我建议仅当XFF为空且IP来自适当的区域时才允许访问。
然而,正如Mastermind已经注意到的,有些代理将隐藏代理链。例如,Tor网络将发出一个请求,看起来好像它来自最终的代理机器,而不是原始IP。匿名代理通常会声称它们转发的IP与REMOTE_ADDR中报告的IP相同。
基于IP的过滤通常是一种非常粗糙的、最后的访问控制机制。
发布于 2009-04-15 21:34:06
不久前,我问了一个非常类似的问题。
Getting the client IP address: REMOTE_ADDR, HTTP_X_FORWARDED_FOR, what else could be useful?
正如正确指出的,您可以将第一个值视为客户端的IP地址。但也可能是公司网关IP。
而且匿名代理无论如何都会清除这个头中的信息,所以它是有用的,但不可靠。
https://stackoverflow.com/questions/753645
复制相似问题