前言
近日,在搞问卷星
的自动提交脚本,期间遇到了很多反爬虫机制。无论是前端的F12反调试
无限Debugger,对selenium屏蔽
等操作,还是引入了阿里的人机检测
、验证码
、IP限制
等操作,都让我顶不住/(ㄒoㄒ)/~~。不过也学习到了很多关于爬虫的相关知识,所以本文就是来总结知识点的拉。
X-Forwarded-For
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在HTTP头字段标准化草案中正式提出。
上面是来自于百科
的定义,用我的话来总结就是,为了解决反向代理和负载均衡而引入的代理服务器,所导致不能获得客户IP地址而添加的请求头。
在这里需要知道一个小知识(虽然我刚刚才知道)
- TCP是无法伪造IP地址的,因为需要三次握手,即便你修改了数据包,也建立不起连接,除非你只想DDOS攻击服务器。
- 不过UDP倒是可以伪装喔。
通过上面的小知识
,可以知道如果我们没有整Nginx
等代理服务器的话,获得客户端的真实IP地址
是易如反掌
滴。例如在java中直接整request.getRemoteAddr()就OK拉。
不过目前的互联网Web应用谁还是单机
啊(虽然我现在写的都是🤮),都是会有Nginx
等代理服务器来做负载均衡和反向代理的。这个时候我们在使用request.getRemoteAddr()等方法就不灵拉,获得到IP地址
是Nginx
等代理服务器的,而不是客户端的。所以为了解决这个问题才引入了X-Forwarded-For
这个请求头呀。
伪造X-Forwarded-For
通过上面的讲解可以知道,其实一般的客户端(浏览器)发送HTTP请求中是没有X-Forwarded-For
这个请求头字段的,当请求到达第一个代理服务器
的时候,代理服务器
会加上X-Forwarded-For
,并将值设置为客户端的IP地址,如果后面还有多个代理,就追加到X-Forwarded-For
的最左边,当请求到达真实Web服务器的时候,应用通过获取X-Forwarded-For
左边第一个值来作为客户端的真实IP地址。
但真滴那么好吗?当然上面只是最乐观的情况。如果客户端在请求时就带上一个伪造的X-Forwarded-For
,那么每层代理服务器只会追加而不会覆盖掉,这样Web服务器只会拿到虚假的客户端IP地址。
如何防范
去资料[利用X-Forwarded-For伪造客户端IP漏洞成因及防范]那边看把,因为我也没用过呀。