Web应用如何获取用户的真实IP地址
- 2024-06-27 23:42:00
- 丁国栋
- 原创 107
首先我们要明白以下几个问题:
- 用户访问Web应用时,是否可以伪造自己的IP地址?
- 用户访问Web应用时,是否可以隐藏真实IP地址?
用户访问Web应用时,其实不能伪造自己的IP地址,但用户可以通过使用代理服务器隐藏真实的IP。因此作为应用,只能获取到用户使用的代理服务器的IP地址。
由于负载均衡器(例如NGINX、HAProxy、Apache2等,也可以称之为反向代理服务器)的使用,我们经常使用反向代理的方式提供服务,此时应用在负载均衡器的后面,如果不加以设置应用获取的IP实际是负载均衡器的IP地址。
+----------+
| 用户 |
+----------+
|
+--------------------+
| 1级代理服务器 |
+--------------------+
|
+---------------------+
| n级代理服务器 |
+---------------------+
|
+-----------------+
| WAF/CDN |
+-----------------+
|
+---------------------+
| 反向代理服务器 |
+---------------------+
|
+-----------------+
| 应用服务器 |
+-----------------+
对于不同的反向代理服务器设置的方法也不相同,以下是列举几种常用的反向代理服务器的配置。
- nginx
- apache2、httpd
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;这样,应用通过HTTP 的 HEADER 判断真实的IP地址。
同样的原理。参见 remoteip_module、proxy_module 模块的文档。
如果是多级代理,即上游反向代理服务器--自己的反向代理服务器--应用,这样的架构(例如WAF/CDN+Nginx+应用)时。
当上游的代理服务器设置了HTTP头信息中增加 X-Forwarded-For 信息,用于记录客户端的真实IP时,web服务器的日志可以使用 $http_x_forwarded_for变量记录远程客户端的真实IP。格式如下:
Nginx
'$http_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" ';Apache 格式如下:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
应用就可以读取 HTTP HEADER(HTTP头) 中的 HTTP_X_FORWARDED_FOR 作为用户的真实IP。
ASP
Request.ServerVariables("HTTP_X_FORWARDED_FOR")PHP
$_SERVER["HTTP_X_FORWARDED_FOR"]JSP
request.getHeader("HTTP_X_FORWARDED_FOR")
--