抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

前言

近日,在搞问卷星的自动提交脚本,期间遇到了很多反爬虫机制。无论是前端的F12反调试无限Debugger,对selenium屏蔽等操作,还是引入了阿里的人机检测验证码IP限制等操作,都让我顶不住/(ㄒoㄒ)/~~。不过也学习到了很多关于爬虫的相关知识,所以本文就是来总结知识点的拉。

X-Forwarded-For

X-Forwarded-ForXFF)是用来识别通过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漏洞成因及防范]那边看把,因为我也没用过呀。

查阅资料

[利用X-Forwarded-For伪造客户端IP漏洞成因及防范]

百度百科