X-Forwarded-For 拿到的就是真实 IP 吗?

1.故事

在这个小节最先前,我先讲一个开发中的小故事,可以加深一下人人对这个字段的明了。

前段时间要做一个和风控相关的需求,需要拿到用户的 IP,开发后灰度了一小部分用户,测试发现后台日志里灰度的用户 IP 全是异常的,哪有这么巧的事情。随后测试发过来几个异常 IP:

10.148.2.122
10.135.2.38
10.149.12.33
...

一看 IP 特征我就明了了,这几个 IP 都是 10 开头的,属于 A 类 IP 的私有 IP 局限(10.0.0.0-10.255.255.255),后端拿到的肯定是署理服务器的 IP,而不是用户的真实 IP。

2.原理

image-20200524154345598

现在有些规模的网站基本都不是单点 Server 了,为了应对更高的流量和更天真的架构,应用服务一样平常都是隐藏在署理服务器之后的,比如说 Nginx。

加入接入层后,我们就能对照容易的实现多台服务器的负载平衡和服务升级,固然另有其他的利益,比如说更好的内容缓存和平安防护,不外这些不是本文的重点就不展开了。

网站加入署理服务器后,除了上面的几个优点,同时引入了一些新的问题。比如说之前的单点 Server,服务器是可以直接拿到用户的 IP 的,加入署理层后,如上图所示,(应用)原始服务器拿到的是署理服务器的 IP,我前面讲的故事的问题就出在这里。

Web 开发这么成熟的领域,肯定是有现成的解决设施的,那就是 X-Forwarded-For 请求头。

X-Forwarded-For 是一个事实标准,虽然没有写入 HTTP RFC 规范里,从普及程度上看实在可以算 HTTP 规范了。

这个标准是这样界说的,每次署理服务器转发请求到下一个服务器时,要把署理服务器的 IP 写入 X-Forwarded-For 中,这样在最末端的应用服务收到请求时,就会获得一个 IP 列表:

X-Forwarded-For: client, proxy1, proxy2

由于 IP 是一个一个依次 push 进去的,那么第一个 IP 就是用户的真实 IP,取来用就好了。

然则,事实有这么简朴吗?

3.攻击

从平安的角度上思量,整个系统最不平安的就是人,用户端都是最好攻破最好伪造的。有些用户就最先钻协议的破绽:X-Forwarded-For 是署理服务器添加的,若是我一最先请求的 Header 头里就加了 X-Forwarded-For ,不就骗过服务器了吗?

1. 首先从客户端发出请求,带有 X-Forwarded-For 请求头,内里写一个伪造的 IP:

X-Forwarded-For: fakeIP

2. 服务端第一层署理服务收到请求,发现已经有 X-Forwarded-For,误把这个请求当成署理服务器,于是向这个字段追加了客户端的真实 IP:

X-Forwarded-For: fakeIP, client

3. 经由几层署理后,最终的服务器拿到的 Header 是这样的:

X-Forwarded-For: fakeIP, client, proxy1, proxy2

要是根据取 X-Forwarded-For 第一个 IP 的思绪,你就着了攻击者的道了,你拿到的是 fakeIP,而不是 client IP。

4.破招

服务端若何破招?上面三个步骤:

  • 第一步是客户端造假,服务器无法介入
  • 第二步是署理服务器,可控,可提防
  • 第三步是应用服务器,可控,可提防

第二步的破解我拿 Nginx 服务器举例。

我们在最外层的 Nginx 上,对 X-Forwarded-For 的设置如下:

proxy_set_header X-Forwarded-For $remote_addr;

什么意思呢?就是最外层署理服务器不信任客户端的 X-Forwarded-For 输入,直接笼罩,而不是追加

非最外层的 Nginx 服务器,我们设置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for 就是追加 IP 的意思。通过这招,就可以破解用户端的伪造设施。

第三步的破解思绪也很容易,正常思绪我们是取X-Forwarded-For 最左侧的 IP,这次我们反其道而行之,从右边数,减去署理服务器的数目,那么剩下的 IP 里,最右边的就是真实 IP。

X-Forwarded-For: fakeIP, client, proxy1, proxy2

比如说我们已知署理服务有两层,从右向左数,把 proxy1proxy2 去掉,剩下的 IP 列表最右边的就是真实 IP。

相关思绪和代码实现可参考 Egg.js 前置署理模式。

5.一句话总结总结

通过 X-Forwarded-For 获取用户真实 IP 时,最好不要取第一个 IP,以防止用户伪造 IP。


文章推荐

下面我要推荐我的几篇文章:

  • 一篇先容了 webpack 中最易混淆的 5 个知识点,掘金快 800 赞了,一文讲清楚 Webpack 中那些 长得像却意义差别的观点
  • 一篇详细先容了 webpack dll 是个什么东西,而且给出了 2 条最佳实践, 脱节繁琐的 dll 设置
  • React Native 性能优化指南从渲染层的角度剖析了 RN 性能优化的 6 个点,并以图文形式讲解了 FlatList 的实现原理
  • Web Scraper——轻量数据爬取利器 先容了一个小巧的浏览器爬虫插件,可以实现简朴的数据爬取功效

最后推荐一下我的小我私家民众号:「卤蛋实验室」,平时会分享一些前端手艺和数据剖析的内容,人人感兴趣的话可以关注一波:


,

欧博注册网址

www.cx11gw.cn欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。

发布评论

分享到:

天津小吃:最近李佳琦1分钟卖出10000片牛排,第二次卖牛排的时刻却“翻车”了!!! 喊粉丝不要拍,不要拍,去退款,发生了什么事呢? 原来,这是由于李佳琦在
2 条回复
  1. 欧搏注册
    欧搏注册
    (2020-06-08 02:50:47) 1#

    欧博网址www.aidshuhehaote.com欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。每天下班都看的

    1. UG环球充值
      UG环球充值
      (2020-06-29 01:49:48)     

      欧博APP下载欢迎进入欧博APP下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。朋友都说还可以

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。