19.3 请求头伪造
- 伪造原理
在阅读本文前,大家要有一个概念,在实现正常的TCP/IP 双方通信情况下,是无法伪造来源 IP 的,也就是说,在 TCP/IP 协议中,可以伪造数据包来源 IP ,但这会让发送出去的数据包有去无回,无法实现正常的通信。这就像我们给对方写信时,如果写出错误的发信人地址,而收信人按信封上的发信人地址回信时,原发信人是无法收到回信的。
注意:本文伪造来源IP 是带引号的。并非是所有 HTTP 应用程序中存在此漏洞。 - 那么如何伪造这项值(X-Forward-For)?
方法一: 如果你会写程序,并了解HTTP 协议,直接伪造请求 header 即可
方法二: 使用 Firefox 的Moify Headers 插件即可(推荐) - 如何避免伪造ip
方法:服务器重新配置X-Forward-For 为正确的值
反爬
反反爬:
1.请求头伪造
2.多次采集数据 Time.sleep(random)
3.ip地址的代理(推荐)
数据头User-Agent反爬虫机制解析:
当我们使用浏览器访问网站的时候,浏览器会发送一小段信息给网站,我们称为Request Headers,在这个头部信息里面包含了本次访问的一些信息,例如编码方式,当前地址,将要访问的地址等等。这些信息一般来说是不必要的,但是现在很多网站会把这些信息利用起来。其中最常被用到的一个信息,叫做“User-Agent”。网站可以通过User-Agent来判断用户是使用什么浏览器访问。不同浏览器的User-Agent是不一样的,但都有遵循一定的规则。
但是如果我们使用 Python 的 Requests 直接访问网站,除了网址不提供其他的信息,那么网站收到的User-Agent是空。这个时候网站就知道我们不是使用浏览器访问的,于是它就可以拒绝我们的访问
import urllib.request
from urllib import request
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36" }
url = "https://www.baidu.com"
response = request.Request(url=url,headers=headers)
resp = request.urlopen(response)
data = resp.read()
print(data)
with open("baidu.html","wb") as f:
f.write(data)
from urllib import request
import random
us = ["Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" ]
headers = { "User-Agent":random.choice(us) }
print(headers)
url = "https://www.baidu.com"
response = request.Request(url=url,headers=headers)
resp = request.urlopen(response)
data = resp.read()
print(data)
# with open("qq.html","wb") as f:
# f.write(data)
import random from urllib
import request
import chardet
us = ["Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" ]
headers = { "User-Agent":random.choice(us) }
url = "http://www.sina.com.cn"
#真正的请求头对象 req = request.Request(url=url,headers=headers)
resp = request.urlopen(req)
data = resp.read()
#返回的是字典对象
res = chardet.detect(data)
char = res.get("encoding")
print(char)
#print(res) html = data.decode(char)
# html = data.decode("gb2312",errors="ignore")
# #先转为二进制数据 转为字符串
# print(html)
# with open("qq.html","wb") as f:
# f.write(data)
版权声明:本文为balanceone原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。