当前位置: 首页 > 后端技术 > Python

如何设计抗震且美观的反爬虫?

时间:2023-03-25 21:08:29 Python

地震高岗,千古流芳山水一派;门临海,三水万年同流。是的,这就是《鹿鼎记》天地会的密码。为什么天地会需要连接码?假设天地会赤火堂香主派人从京城前扬州送来一封非常重要的密信给青木堂香主韦小宝,我们可以将这件事情抽象成下图:这件事情的核心是帮派成员——A交出一个给黑帮成员-B的重要密信。假设A和B互不认识,素未谋面,帮派成员-A如何判断机密信件是交给了帮派成员-B,而不是交给了错误的人-其他帮派成员-丁?在历史实践中,我一定遭受过这样的损失。随天地会采用联合密码,保证甲乙双方为同一帮派成员,三江万年同流;只有帮派成员知道密码,绝不能泄露。当A和B相遇时,帮派成员-A会诉说地震高山,溪山秀丽千古。帮派成员-B听完后,必须回答下一句:门临海,三水千秋。如果帮派成员-B不知道下一句是什么,或者在胡说八道,那么帮派成员-A就可以确定他不是连接器,而是冒牌货。同理,帮派-B想听帮派-A说说高岗地震,那是千古美景。否则,帮派A就是个冒牌货,很有可能会把冒牌的密信交给青木堂的韦小宝。天地会的连接器之间相互传递消息(密信),这很类似于我们开发WEB应用时的Client和Server。抽象起来是这样的:那么问题来了,天地会Client和Server之间需要这样的暗号吗?羊毛布?答案是肯定的!Client就像帮派成员-A,Server就像帮派成员-B,他们的密信很可能被其他帮派成员拿走或伪造-D。既然世界上都会有一个连接码,那么Client和Server之间用什么来保证消息是第一手发送的,而不是被拦截和伪造的呢?没错,签名验证!签名验证是IT技术领域广泛使用的API接口数据保护方式之一。可以有效防止报文接收端将篡改或伪造的报文当作正常报文处理。??需要注意的是,它的作用是防止消息接收端将被篡改或伪造的消息当作正常消息处理,而不是防止消息接收端收到假消息。实际上,接口并不能在收到消息的一瞬间判断消息的真假。这很重要,不要混淆。假设Client要将下月5日刺杀鳌拜的重要密信交给Server,抽象图如下:如果此时发生冒名顶替事件,会产生什么影响:其他团伙成员-丁会在收到客户的信息后进行处理。为了锻造,将刺杀鳌拜的时间从5号改为6号,导致服务器收到的刺杀时间为6号。如此一来,内外联手刺杀鳌拜就成了一方拖延。这场蓄谋已久的刺杀行动很可能会失败,造成不小的损失。我们使用签名验证来改进此消息传递和验证。这里的签名校验可以简单理解为在原始报文的基础上进行一定的计算和加密规则,最后将加密后的结果放入报文中一起发送。消息接收方得到消息后,按照相同的规则进行计算和加密,将自己计算得到的加密值与传递过来的加密值进行比较。如果两个值相同,则说明该消息没有被拦截和伪造。否则,可以确定该消息已被拦截和伪造。这里我们通过实际网站中的例子来加深理解,打开http://www.porters.vip/verify...,网页如下图所示:用鼠标点击图中黄色按钮-点击查看详情,此时网页内容发生变化,页面如下图所示:为了观察和分析,我们调用浏览器内置的开发者工具(快捷键F12或Command+Option+I)并切换到网络面板。此时刷新页面,再次点击黄色按钮。点击之后,我们会在Network面板看到很多网络请求记录,其中有一个Name很长的请求,点击它。单击后,网络面板将分为左右两列。左边还是请求记录,右边是我们选择的请求记录的请求详情。我们选择的网络请求信息如下图所示:从General和QueryStringParameters我们知道,对http://www.porters.vip/verify...接口的请求携带了actions、tim、randstr和sign等4个参数。这里的sign字段和对应的值就是签名校验中的签名,即经过一定规则计算加密后的值。如果没有标志,Client只发送actions,tim和randstr给Server,那么团伙Ding就可以很容易的伪造消息发送给Server,例如:Server收到后就当做普通消息,并且没有办法判断消息是谁发送的,是否被拦截或篡改。所以问题是:标志在这里扮演什么角色?假设sign的运算规则为:sign=MD5(str(actions+10086)+str(tim)+randstr*3)Client中设置的运算规则相当于联合代码中的前半句:地震高岗,一派喜单千古修,服务端拿到actions、tim、randstr和sign后,用同样的算法计算new_sign的值,最后判断客户端发送的sign和服务端计算的new_sign是否一致本身,它看起来是这样的:new_sign=MD5(str(actions+10086)+str(tim)+randstr*3)当然,这里的交互只是单向的,服务端不需要开门sea,并用三江水万年回复客户端(其实也可以,只是网络通讯中没必要)。即使其他帮派成员-丁截获消息并篡改,也不会影响服务器,因为其他帮派成员-丁不知道符号是如何计算的。被篡改的数据计算出的new_sign和接收到的sign不一样,所以Server可以区分真假消息,丢弃假消息。有了连接码,消息接收方Server就不用担心收到假密信了。签名验证被广泛使用。例如下载操作系统镜像文件时,官网会提供该文件的MD5值,以及阿里巴巴/腾讯/华为等公司开放的接口认证部分的符号值。本文改编自《Python3 反爬虫原理与绕过实战》的第4章第3节。本书是爬虫领域第一本专门介绍反爬虫的书籍。从“攻”和“防”的角度描述了爬虫技术与反爬虫技术的交锋。过程,并详细介绍了原理和具体实现方法。通过本书,您将了解签名验证、文本混淆、动态渲染、加解密、代码混淆、行为验证码等反爬虫技术的成因及绕过方法。书中介绍的反爬虫知识涵盖了市面上90%以上的反爬虫手段知识点,非常硬核。掌握了这些知识之后,你的理论基础就会非常扎实,能够轻松应对一线大厂高级爬虫工程师面试中的理论题和思维题。实战方面,除了本书内置的21个在线练习实例外,还需要结合工作中遇到的综合反爬虫进行练习,稳步提升个人技术实力。?本文使用的范例网站http://www.porters.vip/verify...正是书中21个在线练习范例之一。这本书在预售阶段售出了1000多册。第一批出版后就被工程师抢购一空,马上就申请了第二批印刷,可见人气之高。本书已参加京东图书50折活动,现价仅44.5元,赶快购买吧!