Web应用如何获取用户的真实IP地址

2024-06-27 23:42:00
丁国栋
原创 107
摘要:本文介绍Web应用如何获取用户真实的IP地址,适用于大多数应用、编程语言和场景。

首先我们要明白以下几个问题:

  1. 用户访问Web应用时,是否可以伪造自己的IP地址?
  2. 用户访问Web应用时,是否可以隐藏真实IP地址?

用户访问Web应用时,其实不能伪造自己的IP地址,但用户可以通过使用代理服务器隐藏真实的IP。因此作为应用,只能获取到用户使用的代理服务器的IP地址。


由于负载均衡器(例如NGINX、HAProxy、Apache2等,也可以称之为反向代理服务器)的使用,我们经常使用反向代理的方式提供服务,此时应用在负载均衡器的后面,如果不加以设置应用获取的IP实际是负载均衡器的IP地址。

       +----------+
       |   用户   |
       +----------+
            |
       +--------------------+
       | 1级代理服务器 |
       +--------------------+
            |
       +---------------------+
       |  n级代理服务器 |
       +---------------------+
            |
       +-----------------+
       |   WAF/CDN   |
       +-----------------+
            |
       +---------------------+
       | 反向代理服务器 |
       +---------------------+
            |
       +-----------------+
       |  应用服务器  |
       +-----------------+


对于不同的反向代理服务器设置的方法也不相同,以下是列举几种常用的反向代理服务器的配置。


  1. nginx

  2. 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地址。


  3. apache2、httpd
  4. 同样的原理。参见 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")

--

发表评论
博客分类