如何设计一款暗度陈仓的反爬虫

2024-04-27 07:08

本文主要是介绍如何设计一款暗度陈仓的反爬虫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文授权转载自搜狐技术产品,特此感谢。

明修栈道、暗渡陈仓是一组出自《史记·淮阴侯列传》的成语,指将真实的意图隐藏在表面行动的背后,用明显的行动迷惑对方,使敌产生错觉,从而忽略我方的真实意图,达到出奇制胜效果的手段。

市面上常见的反爬虫手段种类繁多,例如文本混淆反爬虫、动态渲染反爬虫、信息校验反爬虫和代码混淆反爬虫等等。其中的文本混淆反爬虫就是明修栈道,暗度陈仓的具体实现,举个例子:

上图中的评论数 3803 是给用户看的,即明修栈道;但如果通过爬虫程序或者自动化工具去取值,只能得到几个不知其意的方框。《Python3 反爬虫原理与绕过实战》一书中提到过,这是因为字体的渲染是在浏览器层面进行的,而不是把字体写入到 HTML 文件中,遂爬虫程序无法获得真实有效的评论数。

这种类似的方法还有很多,例如利用 SVG 映射与 CSS 样式关系实现的文本混淆、利用 CSS 坐标偏移实现的文本混淆,利用 Canvas 绘图实现的图片文本混淆等,这些在《Python3 反爬虫原理与绕过实战》均有详细的原理介绍和用于绕过的反向推导过程,感兴趣的读者可以去翻阅此书。

今天我们我们来学习这种明修栈道,却暗度陈仓的另外一种应用场景,并掌握其反爬虫原理和具体的实现方法。在开始学习之前,请你尝试解密这段字符串:

GBHDHJGOGDGJGOHD==

为什么要解密它呢?

我们来设定一个场景,假设你是一名爬虫工程师,你现在需要爬取上图中的店铺名称——小龙坎老火锅(工体店),当你分析网络请求时发现请求信息如下:

从请求信息中可以看出,city 大概率代表城市、street 大概率代表街道编号、id 大概率是这个店铺的编号,time 大概率是当前请求的时间戳、key 有可能是生成 sign 的钥匙。如果你想用程序模拟发出这样的请求,你就必须知道 key 的值是怎么来的,这正是前后端工程师设置的反爬虫手段。

这段值看起来像是 Base64 编码后的结果,我们试试用 Base64 进行解码,看看得到什么值:

ю1‰áÃĄ

没错,你得到的是这个东西,看起来不像是正常的字符串,也就是说那并不是 Base64 编码的结果。

现在怎么办呢?

翻代码,你需要去翻 JavaScript 代码,尝试找到加密的位置和对应的算法。

经过你一顿搜索和调试,你看到了这样的代码:

这几乎可以肯定,网站就是用了 Base64 进行编码,但为什么解码结果就是不对呢?

百思不得其解

你感到非常困顿

这件事耽误了你两天

总觉得哪里有问题

… …

没错,这就是前后端工程师想要的反爬虫效果,也是这次明修栈道 暗渡陈仓反爬虫设计想要的效果。那么我们怎么设计,又如何实现这样的反爬虫呢?

Base64 编码详解

我们来看看 Base64 编码的规范,看它是如何实现字符串编码功能的。Base64 的 RFC 文档编号为 4648,文档地址为 https://tools.ietf.org/html/rfc4648。RFC4648 约定了 Base16、Base32 和 Base64 的编码规范和计算方法。将字符进行 Base64 编码时:

  1. 先要将字符转换成对应的 ASCII 码,得出 8 位二进制数

  2. 接着连接 3 个 8 位输入,形成字节数为 24 的输入组

  3. 再将 24 位输入组拆分成 4 组 6 位的二进制数

  4. 然后将 6 位二进制数转换为十进制数

  5. 最后找到十进制数在 Base64 编码表中对应的字符,并将这些字符组合成新的字符串

这个字符串就是编码结果,编码过程中用到的 Base64 编码表如下图所示:

文档中提到:如果字符位数少于 24 位,那么就需要进行特殊处理,即在编码结果的末尾用“=”符号填充。这也正是为什么很多 Base64 编码结果末尾总是带有 1 或 2 个“=”符号的原因。

我们可以通过一个例子来加深对 Base64 编码过程的理解。我们将字符 async 转换成 ASCII 码,并找到对应的 8 位二进制数,字符、ASCII 码和 8 位二进制数的对应值如下图所示:

接着将 3 组 8 位二进制数连接成 24 位的输入组,再将 24 位输入组拆分成 4 组 6 位的二进制数。

要注意的是,如果输入组的元素不足 24 位,那么就用 0 进行填充。24 位输入组转换成 6 位二进制数 的过程下图所示:

得到 6 位二进制数之后,我们还需要计算出对应的十进制。二进制转十进制其实是按权相加,将 8 二进制数写成加权系数展开式,并按十进制加法规则求和。字符“a”对应的 6 位二进制数为 011000,将其转换成十进制时的计算过程下图所示:

按照这个计算方法,计算其他的 6 位二进制数,最后得到字符“async”对应的十进制值:

24 23 13 57 27 38 12 65

补位字符“=”没有对应的值,本书约定其值为 65。在得到所有的十进制值之后,就可以将其与 RFC4648 中的 Base64 编码表进行映射,从而得出编码后的字符串。映射过程下图所示:

最终得出字符“async”的 Base64 编码结果为“YXN5bmM=”,完整的编码过程如下图所示:

Base64 编码时所用的对照表是固定的,也就是说它的编码过程是可逆的。这意味着我们只需要将编码的流程倒置,就能够得解码的方法。

知识扩展:Base64 编码表中的“+”和“/”会影响文件编码和 URI 编码,我们在实际使用时,需要考虑到应 用场景中是否包含文件编码或 URI 。如果在 URI 场景下使用 Base64,就会引起错误,RFC4648 文档 中给出了一个解决办法:使用“-”和“_”替代“+”和“/”。

基于编码的反爬虫设计

在上一节中我们学习了 Base64 编码的相关知识,了解到编码过程以及使用到的对照表。Base64 被广泛应用在互联网中,有经验的爬虫工程师看到带有“==”符号或者“=”符号的字符串时,自然 就会认为这是 Base64 编码字符串后得到的结果。如:

d3d3Lmh1YXdlaS5jb20=
d3d3Lmp1ZWppbi5pbQ==

这时候,爬虫工程师只需要按照 Base64 解码规则进行倒推,就能得到原字符。很多编程语言有 Base64 解码模块,解码不费吹灰之力。我们可以使用 Python 解码上方的字符串:

代码运行后,输出结果如为:

www.huawei.com
www.juejin.im

爬虫工程师很轻松就拿到了原字符,这显然不是开发者想要见到的结果。其实我们可以通 过自定义编码规则的方式保护数据。只需要稍微改动一下 Base64 编码过程中用到的对照表,或者改动输入组的划分规则,就可以创造一个新的编码规则。

Base64 编码和解码时都是将原本 8 位的二进制数转换成 6 位的二进制数。如果我们改动位数,将其设置为 5 位或者 4 位,那么就可以实现新的编码规则,对应的 Python 代码如下:

类 Custom64 完成了自定义位数的编码和解码功能。代码大体功能和逻辑如下:

  1. 用字典实现 RFC4648 中的 Base64 编 码表

  2. 然后定义了用于编码字符串的方法 encode() 和用于解码的方法 decode(),以及其他用于转换的方法

  3. 使用参数传递的方式就可以在 Base64 编码和自定义编码之间进行切换

代码运行后,输出结果如下:

GBHDHJGOGDGJGOHD==
asyncins

当我们使用 Custom64 对字符“asyncins”进行编码时,只要设置 threshold 的值不为 6,得到的编码结果就是不相同的。如果爬虫工程师使用 Base64 对该编码结果进行解码,那么他将无法得到正确的原字符。这不仅达到了保护数据的目的,还能够迷惑爬虫工程师,使其将时间花费在“Base64 解 码不成功”的问题上

要注意的是,在 JavaScript 代码中实现时,我们可以将对象名设置为 Base64,编码函数的名称设置为 encode 或者 encrypt,这样一来代码调用时的写法为:

Base64.encode()
// 或者
Base64.encrypt()

就算爬虫工程师跟进 encode 或者 encrypt 函数,看到的也会跟实际的 Base64 编码算法极其相似的代码,一不小心忽略细节,就会错过获得正确破解方法的机会。

同样的方法还可以应用在其他编码或者加密算法上,例如 MD5、AES 或者 SHA256 等。

关于本文

本文改编自《Python3 反爬虫原理与绕过实战》第 10 章,这本书是爬虫领域第一本专门介绍反爬虫的书,从“攻”与“防”两个角度描述了爬虫技术与反爬虫技术的对抗过程,并详细介绍了这其中的原理和具体实现方法。

通过这本书,你将了解到签名验证、文本混淆、动态渲染、加密解密、代码混淆和行为验证码等反爬虫技术的成因和绕过方法。书本中介绍到的反爬虫知识覆盖了市面上 90% 以上的反爬虫手段知识点,非常硬核。

年度最受欢迎的反爬虫图书

《Python 3反爬虫原理与绕过实战》

作者:韦世东

这本书是爬虫领域第一本专门介绍反爬虫的书,从“攻”与“防”两个角度描述了爬虫技术与反爬虫技术的对抗过程,并详细介绍了这其中的原理和具体实现方法。

通过这本书,你将了解到签名验证、文本混淆、动态渲染、加密解密、代码混淆和行为验证码等反爬虫技术的成因和绕过方法。

掌握这些知识后,你的理论基础将非常扎实,能够轻松应对一线大厂中高级爬虫工程师面试的理论和思路问题。

实战方面,除了本书搭建的 21 个在线练习示例之外,还结合工作中遇到的综合反爬虫进行演练,从而稳步提升个人技术实力。

题图来源:豆瓣@素手出锋芒,《楚汉传奇》影视剧截图

☟ 京东下单只要 44.5 哦~

这篇关于如何设计一款暗度陈仓的反爬虫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939826

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

创业者该如何设计公司的股权架构

本文来自七八点联合IT橘子和车库咖啡的一系列关于设计公司股权结构的讲座。 主讲人何德文: 在公司发展的不同阶段,创业者都会面临公司股权架构设计问题: 1.合伙人合伙创业第一天,就会面临股权架构设计问题(合伙人股权设计); 2.公司早期要引入天使资金,会面临股权架构设计问题(天使融资); 3.公司有三五十号人,要激励中层管理与重要技术人员和公司长期走下去,会面临股权架构设计问题(员工股权激