好的,我有一个小的身份验证问题。我的 Web 服务允许使用用户名和密码通过 HTTP 连接到我的 API,但此连接也可以限制为特定的 IP 地址。
这意味着$_SERVER['REMOTE_ADDR']
可能是不正确的。我已经知道任何 IP 信息永远都不能真正可靠 - 我设置限制只是为了尝试添加另一层安全性。
如果这是对我的网络服务器的请求的总体概述:
clientSERVER => clientPROXY => myPROXY => mySERVER
那么这意味着 mySERVER 显示REMOTE_ADDR
myPROXY 而不是客户端的 IP,并将客户端的实际 IP 发送为HTTP_X_FORWARDED_FOR
.
为了克服这个问题,我的网络服务有一个“可信代理”IP 地址列表,如果REMOTE_ADDR
来自这些受信任的 IP 地址之一,然后它告诉我的 Web 服务实际的 IP 地址是HTTP_X_FORWARDED_FOR
.
现在问题出在 clientPROXY 上。这意味着(经常)mySERVER 得到HTTP_X_FORWARDED_FOR
具有多个 IP 地址的值。根据HTTP_X_FORWARDED_FOR
根据文档,该值是一个以逗号分隔的 IP 地址列表,其中第一个 IP 是实际真实客户端的 IP 地址,其他每个 IP 地址是代理的 IP 地址。
So, if HTTP_X_FORWARDED_FOR
有多个值,并且我的服务受 IP 限制,我是否必须检查“最后一个”值HTTP_X_FORWARDED_FOR
对照我允许的 IP 列表并忽略实际的客户端 IP?
我假设在一个系统中,我必须设置允许的 IP 地址列表,列入白名单的 IP 地址应该是代理的 IP 地址,而不是代理后面的 IP(因为这可能是某些本地主机 IP 并且经常更改) 。
还有什么HTTP_CLIENT_IP
?
您可以使用此功能来获取正确的客户端 IP。
function get_client_ip() {
if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
return $_SERVER['REMOTE_ADDR'];
} else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
return $_SERVER['HTTP_CLIENT_IP'];
}
return '';
}
或者,使用 PHP 7+ 您可以使用以下方式编写函数空合并运算符 https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op.
function get_client_ip() {
return $_SERVER['HTTP_X_FORWARDED_FOR']
?? $_SERVER['REMOTE_ADDR']
?? $_SERVER['HTTP_CLIENT_IP']
?? '';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)