通过代理请求时获取原始IP
我正在写一个小的Python脚本,用来检查和显示进来的IP地址。直接获取IP地址的方法很简单,只需要用下面的代码:
remote_addr2 = os.environ.get('REMOTE_ADDR')
这段代码可以正确显示发出请求的IP地址。不过,我现在遇到的难题是,如果请求是通过代理发出的,我该如何检测到原始的IP地址。根据这篇文章,我了解到需要使用HTTP_X_FORWARDED_FOR
,于是我尝试把它赋值给一个变量并显示出来,像这样:
remote_addr1 = os.environ.get('HTTP_X_FORWARDED_FOR')
但是输出的结果总是None
。我看到有类似的问题在PHP的讨论中被回答过。我觉得我在第二行尝试做的事情和那个问题类似,但我测试过的每个代理(比如Anonymouse、HideMyAss、FilterByPass)都给我返回了'None'。
这是我完整的程序(很简单,我还没有实现验证):
#!/usr/bin/python
import os
import cgi
print "Content-type:text/html\r\n\r\n"
print '<html>'
print '<head>'
print '<title>WHOIS - TESTs</title>'
print '</head>'
remote_addr1 = os.environ.get('HTTP_X_FORWARDED_FOR')
remote_addr2 = os.environ.get('REMOTE_ADDR')
print '<body>'
print remote_addr1
print remote_addr2
#print cgi.escape(os.environ["REMOTE_ADDR"])
print '</body>'
print '</html>'
示例输出:
我哪里出错了呢?谢谢大家。
2 个回答
-1
这些信息不会以任何方式呈现给你。当用户向服务器发送一个http请求时,服务器可以知道这个用户的IP地址,这个IP是他的网络服务提供商(ISP)分配给他的。不过,当用户通过另一个代理服务器或VPN来连接时,发出去的请求是由那个服务器(或者VPN)代替用户发送的。在这种情况下,你看到的唯一IP地址是网络或服务器的IP,而不是用户原本的IP地址。
0
你提到的那些代理是用来隐藏客户端信息的。为了这个目的,它们不会把IP地址传递给你的服务器,不管是在X-Forwarded-For
字段还是其他任何字段里。
你可以试着通过一个不隐藏身份的代理发送请求,看看X-Forwarded-For
这个字段是否存在。并不是所有的代理都支持这个功能,有些代理只会设置Via
或者Forwarded
字段,你也应该关注这些。