以下是我对用户IP的理解:
用户的IP为REMOTE_ADDR
。但是,如果用户使用代理(如HotSpotSheild(HSS))或代理链,那么REMOTE_ADDR
是代理的地址(不是用户的IP),用户的IP可能在其他标题中,如下所示:
HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
HTTP_X_FORWARDED
HTTP_X_CLUSTER_CLIENT_IP
HTTP_FORWARDED_FOR
HTTP_FORWARDED
因此,当用户使用代理时,他就无法检测到。
问题1:这些标题(上图)中的一个是否已满?其余的都是空的吗?
问题2:我最好将REMOTE_ADDR
和其中一个标题(非空)存储在其他字段中数据库? (我的意思是IP有两个独立的列,而不仅仅是一列)
以下是我对负载均衡器的理解:
它是您在运行服务器群集时使用的反向代理服务器。客户端连接到负载均衡器,并将连接转发到其中一个实际服务器。
理论值:
如果您使用负载均衡器,请使用
HTTP_X_FORWARDED_FOR
作为用户的IP。
问题3
当有负载均衡器时,为什么要将bHTTP_X_FORWARDED_FOR
存储为用户的IP?我的意思是bHTTP_X_FORWARDED_FOR
与负载均衡器有什么关系?
答案 0 :(得分:2)
这完全是关于信任和具体实施细节的概念。
如果您的系统信任代理服务器(例如,在反向代理情况下),那么您可以信任它在其中一个HTTP标头中传递给您的IP。
如果没有理由信任代理服务器(例如Hotspot Shield等随机互联网代理),那么您的系统不知道传递给您的IP是否已经完成。
您可以根据REMOTE_ADDR
获得您信任的服务器白名单,如果您从其中一个获得连接,那么您可以使用HTTP标头中的IP(尽管最好将两者都记录为完整性) 。您可能还希望对此进行扩展,以便某些远程代理可以信任某些标头,否则可能存在安全漏洞,用户提供自己的标头以及设置未受损害的代理。
总是其中一个标题(上面)已满?其余的都是空的吗?
取决于代理及其软件实施。
在数据库中的不同字段中存储REMOTE_ADDR和其中一个标题(不是空的)是一个好主意吗? (我的意思是IP有两个独立的列,而不仅仅是一列)
是的,存储两者都没有坏处 - 它们可能对任何审计跟踪都有用。
为什么我应该在那里存储bHTTP_X_FORWARDED_FOR作为用户的IP 是一个负载均衡器?我的意思是&#bHTTP_X_FORWARDED_FOR要做什么 负载均衡器?
因为您的负载均衡器应该是受信任的代理,因此您应该能够信任它为您提供的IP。