Sep
27
WEB开发有各种复杂性,典型的是HTTP的无状态连接,加密什么的,最近碰到的另一个头疼的事情就是如何获取客户端的真实IP。
其实以前在开发WOJ-Land的时候就遇到这个问题了:如果用户使用了HTTP代理来访问的话,通过REMOTE_ADDR只能获取到HTTP代理的IP,当时只是简单地再判断是否有X-FORWARDED-FOR这个HTTP头(对应PHP的$_SERVER['HTTP_X_FORWARDED_FOR'])来获取客户端的IP。虽然基本达到要求,但是还有各种问题。
一个比较常见的问题就是,如果用户通过多层HTTP代理来访问,那么每个代理都会把自己的IP加到X-FORWARDED-FOR这个头里面(用逗号隔开),真实的浏览器端IP应该是列表的第一个IP。
另外,有些CDN或者其他类似代理的服务,会提供其他的HTTP头,比如 Cdn_Src_Ip,Proxy-Client-IP,WL-Proxy-Client-IP, Client-IP等等。
一个比较合适的做法大概应该是这样:
p.s. 以上代码未经实际运行,可能存在语法问题。
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php 。
其实以前在开发WOJ-Land的时候就遇到这个问题了:如果用户使用了HTTP代理来访问的话,通过REMOTE_ADDR只能获取到HTTP代理的IP,当时只是简单地再判断是否有X-FORWARDED-FOR这个HTTP头(对应PHP的$_SERVER['HTTP_X_FORWARDED_FOR'])来获取客户端的IP。虽然基本达到要求,但是还有各种问题。
一个比较常见的问题就是,如果用户通过多层HTTP代理来访问,那么每个代理都会把自己的IP加到X-FORWARDED-FOR这个头里面(用逗号隔开),真实的浏览器端IP应该是列表的第一个IP。
另外,有些CDN或者其他类似代理的服务,会提供其他的HTTP头,比如 Cdn_Src_Ip,Proxy-Client-IP,WL-Proxy-Client-IP, Client-IP等等。
一个比较合适的做法大概应该是这样:
$arr_ip_header = array(
"HTTP_CDN_SRC_IP",
"HTTP_PROXY_CLIENT_IP",
"HTTP_WL_PROXY_CLIENT_IP",
"HTTP_CLIENT_IP",
"HTTP_X_FORWARDED_FOR",
"REMOTE_ADDR",
);
$client_ip = "";
foreach ($arr_ip_header as $key) {
if (!empty($_SERVER[$key]) && strtolower($_SERVER[$key]) != "unknown") {
$client_ip = $_SERVER[$key];
break;
}
}
if (false !== strpos($client_ip, ",")) {
$client_ip = preg_replace("/,.*/", "", $client_ip);
}
"HTTP_CDN_SRC_IP",
"HTTP_PROXY_CLIENT_IP",
"HTTP_WL_PROXY_CLIENT_IP",
"HTTP_CLIENT_IP",
"HTTP_X_FORWARDED_FOR",
"REMOTE_ADDR",
);
$client_ip = "";
foreach ($arr_ip_header as $key) {
if (!empty($_SERVER[$key]) && strtolower($_SERVER[$key]) != "unknown") {
$client_ip = $_SERVER[$key];
break;
}
}
if (false !== strpos($client_ip, ",")) {
$client_ip = preg_replace("/,.*/", "", $client_ip);
}
p.s. 以上代码未经实际运行,可能存在语法问题。
欢迎扫码关注:
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php 。
11111111111111


2018-5-12 10:25






分页: 1/1
1

