爬虫请求指纹检测与绕过 TLS/JA3/Http2
说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除
作者:zhu6201976
一、什么是请求指纹检测?
TLS/JA3、HTTP/2 指纹检测是一种网络流量分析技术,用于识别和分析网络通信中使用的加密协议和通信特征。这些技术通常用于网络安全领域,以便检测恶意活动或进行流量分析。以下是对每个概念的详细描述:
1.TLS(Transport Layer Security)
- 定义: TLS是一种安全通信协议,用于在两个通信应用程序之间提供保密性和数据完整性。
- 功能: TLS通常用于在Web浏览器和服务器之间加密数据传输,确保通信的机密性,防止数据被窃听或篡改。
- TLS指纹检测: TLS指纹检测是通过分析TLS握手过程中的参数,如客户端和服务器支持的加密套件,生成唯一的标识符(指纹)。这有助于识别特定应用程序或设备的TLS实现。
2.JA3(TLS Fingerprinting)
- 定义: JA3是一种用于识别TLS客户端的指纹生成技术。
- 功能: JA3通过分析TLS握手中客户端发送的信息,如支持的加密算法、TLS版本等,生成一个唯一的字符串,代表客户端的TLS行为。
- JA3指纹检测: JA3指纹检测用于追踪和识别TLS客户端的特征,有助于发现不同设备或应用程序使用的TLS配置。
3.HTTP/2
- 定义: HTTP/2是HTTP协议的一种新版本,用于提高Web性能和效率。
- 功能: HTTP/2引入了多路复用、头部压缩等功能,以减少延迟和提高网络性能。
- HTTP/2指纹检测: HTTP/2指纹检测通过分析网络通信中的HTTP/2协议头部,识别使用HTTP/2的通信流量。这有助于了解网站或应用程序是否采用了HTTP/2协议。
二、如何绕过请求指纹检测?
1.通过原生JS实现请求
原理:网页运行在浏览器中,浏览器所支持的官方语言是JS,因此,通过原生JS构造并发送请求,其TLS/JA3指纹是正常的,理论上不会被拦截。
2.实现了指纹篡改的第三方请求库
某些第三方请求库,底层修改了TLS/JA3的生成方式,因此可以绕过这些检测。
如:
Python的curl_cffi库GitHub - yifeikong/curl_cffi: Python binding for curl-impersonate via cffi. A http client that can impersonate browser tls/ja3/http2 fingerprints.
Go语言版的requests
GitHub - asmcos/requests: A golang HTTP client library. Salute to python requests.
3.wget等Linux命令
在所有的请求工具中,wget请求指纹暂未被列如黑名单,实测可以成功拿到正确响应
三、实战案例
1.url
aHR0cHM6Ly9kb29kcy5wcm8vZS9jMHh2NGplYjdtbmE=
2.说明
该网站使用了简单的CloudFlare风控,而简单版的CloudFlare风控底层检测了常见语言的请求库TLS/JA3指纹,收集并列入了黑名单。因此,非浏览器的请求指纹理论上都会被拒绝响应,比如返回如下信息:
<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Just a moment...</title>
</head>
</html>
一旦检测到非浏览器指纹请求,则返回类似 Just a moment... 错误信息。
3.绕过
此处采用最简单的Python第三方请求库curl_cffi实现绕过,代码如下:
from base64 import b64decode
import requests
from curl_cffi import requests as req
url = b64decode('aHR0cHM6Ly9kb29kcy5wcm8vZS9jMHh2NGplYjdtbmE=').decode('utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
}
resp1 = requests.get(url, headers=headers)
print('resp1', resp1.text)
resp2 = req.get(url, headers=headers, impersonate='chrome110')
print('resp2', resp2.text)
运行结果:
显然,同一个url,curl_cffi成功拿到了正确响应。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!