首页 > network > [架构][安全]动态CDN的防篡改IP地址

[架构][安全]动态CDN的防篡改IP地址

WEB开发当中获取用户的真实IP地址用的是REMOTE_ADDR (以下简称RA),而服务器上层往往会存在代理,比如Nginx,Netscaler,F5等设备,用户侧还可能有配置代理服务器,这样要获取用户的IP地址,业内通常的做法是使用HTTP_X_FORWARDED_FOR(以下简称XFF)来跟踪用户的IP地址。

然而带来方便的同时,给攻击者留下了可利用的漏洞,因为Header头是可以随意修改伪造的,也就是说攻击者可以随意伪造XFF,这也是很多网站在对IP进行限制(比如下单,注册,登录等)失效的原因。

为了安全,获取用户的IP地址只能使用RA,如果用户使用代理,那么RA就是代理服务器的IP地址,宁可错杀。上面提到的Nginx,Netscaler,F5等因为IP地址有限,可以在WEB服务器的插件中配置,比如Apache的RPAF,将用户的的“真实”IP地址,设置到RA地址中,从而让WEB程序跳过各级代理,获取到用户的IP地址。

到上面为止可以解决大部分场景的问题,但是因为中国的特殊情况,南北互通,各种网路问题,动态CDN有了市场。然后在使用动态CDN的过程中问题又来了,WEB程序获取的RA地址是CDN的IP地址,导致各种防刷机制失效,所以要想办法获取到用户的RA,而又不能引入新的安全问题,思考之后采取了下面的解决方案加以解决。

动态CDN供应商将用户的RA地址设置到XFF中(不管是多少层代理),服务端Proxy正常逐级增加,通过Apache的RPAF将白名单中的所有Proxy IP去掉,取最后一个IP地址,即位用户的RA地址。

OK,这里问题来了,如何判断用户的请求是通过CDN过来的,还是直接过来的请求,因为直接过来的请求有可能会伪造XFF,进而导致WEB程序获取到的RA是伪造的,进一步会规避防御策略。

所以为了区分,CDN过来的Header头加入特定指纹,在最上层代理配置,遇到特定指纹,XFF直接复制CDN传过来的XFF即可,如果没有指纹,那么将请求方的XFF+RA作为XFF传递下去,这样WEB应用程序拿到的RA即是没法伪造的用户“真实”IP地址(也可能是客户端的代理IP)。

Related posts:

  1. Golang 实现的 mysql-proxy
分类: network 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.