好的,我有一个小的身份验证问题。我的Web服务允许使用用户名和密码连接到我的API,但此连接也可以限制为特定的IP地址。
这意味着$_SERVER ['REMOTE_ADDR']
可能是不正确的。我已经知道任何IP信息都不能真正依赖 - 我限制只是为了增加另一层安全性。
如果这是对我的Web服务器发出请求的概述:
clientSERVER => clientPROXY => myPROXY => mySERVER
那么这意味着mySERVER显示的是myPROXY的REMOTE_ADDR
而非客户端的IP,并将客户端的实际IP作为HTTP_X_FORWARDED_FOR
发送。
为了解决这个问题,我的Web服务有一个'受信任的代理' IP地址列表,如果REMOTE_ADDR
来自其中一个受信任的IP地址,那么它告诉我的Web服务实际IP地址是HTTP_X_FORWARDED_FOR
的值。
现在问题出现在clientPROXY上。这意味着(很常见)mySERVER得到具有多个IP地址的HTTP_X_FORWARDED_FOR
值。根据HTTP_X_FORWARDED_FOR
文档,该值是逗号分隔的IP地址列表,其中第一个IP是实际真实客户端的IP,每个其他IP地址都是代理的IP。
那么,如果HTTP_X_FORWARDED_FOR
具有多个值并且我的服务受到IP限制,我是否必须检查HTTP_X_FORWARDED_FOR
的'最后'值是否在我的允许IP列表中并忽略实际客户端IP?
我假设在需要设置允许的IP地址列表的系统中,白名单IP地址应该是代理的IP而不是代理后面的IP(因为那可能是某些本地主机IP并且经常更改)。
HTTP_CLIENT_IP
怎么办?