签名验证反爬,反反爬第二篇博客,Python爬虫120例
2023-10-07 19:45:56
知识铺垫
本篇博客继续为大家带来爬虫反爬技术学习,签名验证。在上一篇博客,咱们学习的反爬验证信息,是存储在请求头域中,本次的内容将是验证信息是存储在查询参数和URL中。
本次学习的内容是签名验证,其实这是上一篇博客的延续。上一篇博客,大家应该已经了解到了,反爬虫系统广泛利用爬虫特有的特征来识别爬虫。除了上一篇博客提到的特征外,这次我们将学习关于"从哪里来"的特征。
比如,一个电商网站,他在注册页面,要求用户必须输入手机号才能进行下一步的注册。而用户来源的不同,所表现出来的特征也不同。
PC端用户,一般是通过搜索引擎搜索来到网站,再进行注册。而手机用户,一般是通过其他app通过跳链直接打开网站的注册页面。
这种判断,是防爬的重要手段。
0x01、签名验证
本次学习的这个特征,是来自于请求参数和请求URL。
在参数中嵌入签名,这个是很常见的。主要是给页面减少额外的开发工作量。
比如,电商网站的商品详情页。这个页面,有些数据,比如:商品id,商品价格,商品标题,商品,商品图片等,都是不变的。而且这些数据在其他页面也有,根本不用重新开发。那么,电商网站只需要将这些数据通过接口获取到,然后在页面通过JS解析出来,渲染到页面中即可。
那么这样,就给爬虫带来了麻烦。
因为这些数据,都是通过请求接口后才能获取的,爬虫要想获取,就必须爬取接口。
那么问题来了,爬虫怎么爬取接口?
最简单的,就是将接口的参数,放在请求URL中。如,
http://host/api/get_detail?id=1&token=123456
接口的参数,id 和 token 都在URL中了。
当然,你也可以将参数放在请求体中,但是,爬虫很难正确构造body中的参数。所以,一般参数都会放在URL中。
0x02、反爬
知道了签名验证的原理,那么我们怎么构造签名呢?
一般情况下,一个签名的构造,分两种情况。
- 自己手动计算签名,然后将自己计算得到的签名和网站对比,相等就通过,否则就返回错误。
- 直接用框架来计算签名,框架会提供对应的api,直接调用即可。
比如,Python 中有一个框架,叫做 requests
,可以帮我们计算签名,即:
import requests
url = 'http://host/api/get_detail?id=1&token=123456'
response = requests.get(url)
requests 会帮我们计算出签名,然后自动添加到请求头中,最后发送请求。
这样,我们爬虫就不需要自己去构造签名了。
但是,如果使用签名验证的时候,请求的参数是放在请求体中,requests 就没有办法帮我们自动计算签名了。所以,这种情况就需要我们自己去计算签名了。
2.1 如何构造签名
如果是放在请求URL中,那么直接使用 requests
即可。
如果是放在请求体中,那么就需要我们自己构造签名了。
签名,可以是任何格式,可以是字符串,也可以是数字。
一般来说,签名验证的思路是:
- 先将需要签名的参数,按照一定顺序排序,比如,按照参数名的 ASCII 码顺序排序。
- 然后将排序后的参数,拼接成一个字符串。
- 最后,使用
hashlib
库中的hash函数对字符串进行哈希,得到的就是签名。
下面是Python代码示例:
import hashlib
def generate_signature(params):
# 1. 排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接
拼接字符串 = '&'.join(['='.join(x) for x in sorted_params])
# 3. 哈希
signature = hashlib.sha1(拼接字符串.encode('utf-8')).hexdigest()
return signature
params = {
'id': 1,
'token': '123456'
}
signature = generate_signature(params)
print(signature)
运行代码,即可得到签名。
0x03、反反爬
反爬,就是利用签名来验证爬虫。反反爬,就是爬虫利用一些手段,绕过签名的验证。
3.1 爆破签名
最简单的方式,就是将所有的可能签名都尝试一遍,直到找到正确的签名。
这种方式,如果签名是字符串,那么爆破的难度会很大。
如果签名是数字,那么爆破的难度会小很多。
3.2 利用签名验证的漏洞
签名验证的漏洞,主要有两种。
- 签名验证不严格。
- 签名验证存在逻辑问题。
如果签名验证不严格,那么爬虫就可以构造一个错误的签名,但是服务器端依然会认为是正确的签名,这样爬虫就可以绕过签名的验证。
如果签名验证存在逻辑问题,那么爬虫也可以利用这个漏洞,绕过签名的验证。
3.3 利用中间人攻击
中间人攻击,是指在爬虫和服务器之间,加入一个中间人,这个中间人可以截获爬虫和服务器之间的通信内容,包括签名。
这样,爬虫就可以获取到正确的签名,然后就可以绕过签名的验证。
0x04、总结
签名验证,是反爬虫系统广泛使用的一种技术,主要是利用爬虫特有的特征来识别爬虫。
反反爬,就是爬虫利用一些手段,绕过签名的验证。
最简单的方式,就是将所有的可能签名都尝试一遍,直到找到正确的签名。
还可以利用签名验证的漏洞,绕过签名的验证。
最后,还可以利用中间人攻击,截获爬虫和服务器之间的通信内容,包括签名,然后就可以绕过签名的验证。