我一般认为在PHP脚本中我可以测试$_SERVER['REMOTE_ADDR']
以建立发出请求的IP地址。但是,我开始怀疑事情是否有点复杂。这是方案
请求以
结尾file_get_contents('https://url?data=value')
在服务器上 A,B和C 我非常天真地测试$_SERVER['REMOTE_ADDR']
以确定该请求实际上来自服务器 S 。令我惊讶的是,结果证明是零散且可变的
REMOTE_ADDR
中的值是与注册服务器交互的人类用户的IP地址, S REMOTE_ADDR
中的值是注册服务器的IP地址, S - 我原本期望看到的 REMOTE_ADDR
中的值是我托管服务器 S 我真的不需要执行此额外的验证测试,因此我可以完全放弃它。尽管如此,这一结果让我感到意外,所以我很想知道这里是否有人可以了解正在发生的事情。
我应该提一下,我在 A,B和C 上的 Lighttpd 上运行PHP 5.5,在服务器 S上的Apache 2上运行PHP 5.3。
答案 0 :(得分:3)
REMOTE_ADDR
是Apache(或任何其他Web容器)填充的变量,它包含通信另一端终端的IP地址。
可靠吗?是。
安全吗?取决于,如果您使用它认为它向您显示拨打电话的用户的IP地址,那么您错了,任何代理人都会破坏信息。
在您的情况下,发出HTTP调用的服务器应提供其IP地址,因此方案2应始终发生。我不知道什么时候出了什么问题,但它很奇怪。
要回复Dany Caissy,不要依赖HTTP_X_FORWARDED_FOR
,它可以轻松修改,因为它是HTTP标头,而不是TCP / IP属性。
答案 1 :(得分:2)
REMOTE_ADDR不是获取IP地址的唯一方法,还有:
HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
HTTP_X_FORWARDED
HTTP_X_CLUSTER_CLIENT_IP
HTTP_FORWARDED_FOR
HTTP_FORWARDED
它们以不同的方式设置,可能意味着不同的东西,最终,获取您想要的IP地址非常困难。
编辑:唯一一个可靠且用户无法修改的是REMOTE_ADDR,但它并不总能完全符合您的要求,因此您无需使用其他的,无论如何每个人都说他们是多么'不安全'。