gpt4 book ai didi

php - 如何正确使用 HTTP_X_FORWARDED_FOR?

转载 作者:IT王子 更新时间:2023-10-29 01:04:08 25 4
gpt4 key购买 nike

好的,我有一个小的身份验证问题。我的 Web 服务允许使用用户名和密码通过 HTTP 连接到我的 API,但此连接也可以限制为特定的 IP 地址。

这意味着 $_SERVER['REMOTE_ADDR'] 可能不正确。我已经知道任何 IP 信息都不能真正被依赖——我有这个限制只是为了增加另一层安全性。

如果这是对我的网络服务器的请求的总体概述:

clientSERVER => clientPROXY => myPROXY => mySERVER

这意味着 mySERVER 显示 myPROXY 的 REMOTE_ADDR 而不是客户端的,并将客户端的实际 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 限制,我是否必须对照我允许的 IP 列表检查 HTTP_X_FORWARDED_FOR 的“最后一个”值,并且只需忽略实际的客户端IP?

我假设在一个系统中,我必须设置允许的 IP 地址列表,列入白名单的 IP 地址应该是代理的地址,而不是代理后面的 IP(因为它可能是一些本地主机 IP 和经常更换)。

HTTP_CLIENT_IP 呢?

最佳答案

您可以使用此函数获取正确的客户端 IP:

public function getClientIP(){       
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 - 如何正确使用 HTTP_X_FORWARDED_FOR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11452938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com