Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >进击的反爬机制

进击的反爬机制

原创
作者头像
天存信息
修改于 2021-08-24 06:29:36
修改于 2021-08-24 06:29:36
1.8K0
举报

爬 虫 & 反爬虫

爬 虫:

指通过一定的规则策略,自动抓取、下载互联网上的网页内容,再按照某些规则算法抽取数据,形成所需要的数据集。有了数据,就有可能进行一些非法活动。

反爬虫:

一般指网站管理员使用一定的技术手段,防止爬虫程序对网站的网页内容进行爬取,以及阻止通过爬虫获取数据后的非法活动。

反爬方与爬虫方相互博弈,不断制造爬取难度,或一定程度上阻止了爬虫行为。爬虫方也在不断更新技术,来对抗种种反爬限制。

对抗过程

初始状态下,网站提供网站服务,未部署任何反爬措施。

ROUND 1

爬虫方启动爬虫程序 (实验环境中使用 scrapy 爬取) 成功爬取网页内容。

反爬方发现有爬虫程序在对网站进行爬取,在分析日志中访问请求的 user-agent 后,加载 iWall3 Web应用防火墙模块,编写并加载防护规则 anti-crawlers-match-user-agents.json 如下:

代码语言:txt
AI代码解释
复制
{
  "info": {
    "title": "UA Crawlers list"
  },
  "rules": [
    {
        "meta": {
            "phase": 2,
            "desc": "https://github.com/coreruleset/coreruleset/blob/v3.3/dev/rules/crawlers-user-agents.data"
        },
        "if": {
            "variable": [
                "REQUEST_HEADERS", 
                "REQUEST_BODY", 
                "REQUEST_FILENAME"
            ],
            "transform": "lowercase",
            "operator": "contain",
            "pattern": [
                "80legs",
                "black widow",
                "blackwindow",
                "prowebwalker",
                "pymills-spider",
                "ahrefsBot",
                "piplbot",
                "grapeshotcrawler/2.0",
                "grapefx",
                "searchmetricsbot",
                "semrushbot",
                "rogerbot",
                "mj12bot",
                "owlin bot",
                "lingewoud-550-spyder",
                "wappalyzer",
                "scrapy"
            ]
        },
        "then": [
            "IP.bad_ua_count@20=IP.bad_ua_count+1",
            "if": "IP.bad_ua_count > 3",
            "then": {
                "action": "deny",
                "log": "Too frequnt access from crawlers."
            }
        ]
    }
  ]
}

爬虫方再次爬取网页,发现超过一定阈值后,后续爬虫请求被阻止:

图1
图1

反爬方防护成功。

ROUND 2

爬虫方在初次交锋中 user-agent 被识别,这一次则使用随机的 user-agent (scrapy 使用 random_user_agent 配置),成功爬取网页内容。如下图:

图2
图2

反爬方利用 user_agent 防护的措施失效后,可根据“爬虫 (同一个 IP 地址) 在短时间内会访问多个不同应用 (如 url)”的逻辑,编写并加载防护规则 anti-crawlers-limit-user-access-different-application.json 如下:

代码语言:txt
AI代码解释
复制
{
    "rules": [
        {
            "meta": {
                "phase": 2,
                "function": "当IP.urls字段中不包含当前访问的请求名,则进行设置操作加判断操作。如果是参数代表不同应用修改即可。",
                "function": "设置操作包括给原有的IP.urls字段append新的请求名,并给IP.urls_count加1;",
                "function": "判断操作是判断IP.urls_count是否大于5(代表10秒内访问了不同的url,不同的url代表不同的功能),",
                "function": "若是则deny,否则放行。"
            },
            "if": [
                {
                    "or": [
                        "REQUEST_FILENAME == '/shopxo-1.6.0/index.php' && @ARGS.s == '/index/user/reginfo.html'",
                        "REQUEST_FILENAME == '/shopxo-1.6.0/index.php' && @ARGS.s == '/index/user/logininfo.html'",
                        "REQUEST_FILENAME == '/shopxo-1.6.0/index.php' && @ARGS.s == '/index/category/index.html'",
                        "REQUEST_FILENAME == '/shopxo-1.6.0/index.php' && contain(@ARGS.s, '/index/search/index/category_id')",
                        "REQUEST_FILENAME == '/shopxo-1.6.0/index.php' && contain(@ARGS.s, '/index/article/index/id')",
                        "REQUEST_FILENAME == '/shopxo-1.6.0/index.php' && contain(@ARGS.s, '/index/goods/index/id')"
                    ]
                },
                {
                    "not": {
                        "variable": "IP.args_s",
                        "operator": "contain",
                        "pattern": "';' .. ${@ARGS.s} .. ';'"
                    }
                }
            ],
            "then": [ 
                "IP.args_s@10=IP.args_s .. ';' .. @ARGS.s .. ';'",
                "IP.args_s_count@10 = IP.args_s_count+1",
                "if": "IP.args_s_count > 5",
                "then": {
                    "action": "deny",
                    "log": true
                }
            ]
        }
    ]
}

超过一定阈值后,后续爬虫请求被阻止:

图3
图3

反爬方防护成功。

ROUND 3

爬虫方由于在上一回合中使用同一 IP 地址且访问速度过快,导致反爬方可以依此特性设置防护。故改为使用 IP 代理池 (scrapy 使用 IP 代理池),成功爬取网页内容。Proxy_ip 的设置如下所示:

图4
图4

反爬方更新防护措施,相应地在页面中增加“蜜罐页面链接”。一旦爬虫程序访问“蜜罐页面链接”就会被拦截。编写并加载防护规则 anti-crawlers-add-honeypot-page.json 如下:

代码语言:txt
AI代码解释
复制
{
    "rules": [
        {
            "meta": {
                "phase": 3,
                "function": "当访问/shopxo-1.6.0/idnex.php时,在<a href ...>标签下面增加一个标签(含有假的链接)"
            },
            "if": [
                "REQUEST_METHOD == 'GET'",
                "REQUEST_FILENAME == '/shopxo-1.6.0/'",
                "#ARGS == 0"
            ],
            "then": {
                "execution": [
                    {
                        "directive": "alterResponseBody",
                        "op": "string",
                        "target": "<div class=\"navigation-button am-show-sm-only\">",
                        "substitute": "<div class=\"navigation-button am-show-sm-only\"> <a href=\"http://10.10.11.67/shopxo-1.6.0/index.php?s=/index/user/fake_logininfo.html\"></a>",
                        "ignore_case": false
                    }
                ]
            }
        },
        {
            "meta": {
                "phase": 1,
                "function": "当爬虫进行页面爬取时,就会访问到假的链接时,进行阻止"
            },
            "if": [
                "REQUEST_FILENAME == '/shopxo-1.6.0/index.php'",
                "@ARGS.s == '/index/user/fake_logininfo.html'"
            ],
            "then": {
                "action": "deny"
            }
        }
    ]
}

网站加载此规则后,爬虫程序有些请求会被拦截,效果如图:

图5
图5

反爬方防护成功。

ROUND 4

爬虫方在前面的攻防对抗中,爬虫程序进行全局爬取会访问到“蜜罐页面链接”。为避开蜜罐,爬虫方使用 Selenium + WebDriver 对网站进行访问,成功爬取网页内容。

反爬方为应对新的爬虫手段,尝试在前端做“插桩”操作,并判断返回的 WebDriver 属性,编写并加载防护规则 anti-crawlers-check-is-selenium-chromedriver.json 如下:

代码语言:txt
AI代码解释
复制
{
    "rules": [
        {
            "function": "1.当访问GET /shopxo-1.6.0/index.php?s=/index/user/reginfo.html 时,修改</head>为",
            "function": "<script>const ret = window.navigator.webdriver;$.get(\"http://[这块写上host即可]/shopxo-1.6.0/index.php/send_result.js\"+$ret, function(data, status){});</script></head>",
            "meta": {
                "phase": 3
            },
            "if": [
                "REQUEST_FILENAME == '/shopxo-1.6.0/index.php'",
                "@ARGS.s == '/index/user/reginfo.html'"
            ],
            "then": {
                "execution": [
                    {
                        "directive": "alterResponseBody",
                        "op": "string",
                        "target": "var __user_id__ = 0;",
                        "substitute": "var __user_id__ = 0; var ret = window.navigator.webdriver;var url_ret=\"http://10.10.11.67/shopxo-1.6.0/index.php/send_result.js?ret=\"+ret; var httpRequest = new XMLHttpRequest(); httpRequest.open('GET', url_ret); httpRequest.send(); ",
                        "ignore_case": false
                    }
                ]
            }
        },
        {
            "meta": {
                "phase": 1,
                "function": "当访问send_result.js时,获取到ARGS.ret,查看是否是true,若是则deny"
            },
            "if": [
                "REQUEST_FILENAME == '/shopxo-1.6.0/index.php/send_result.js'",
                "@ARGS.ret != 'false'"
            ],
            "then": {
                "verdict": {
                    "action": "deny",
                    "log": "client is chromedriver!",
                    "continued": {
                        "subject": "REAL_IP",
                        "action": "deny",
                        "duration": 36000,
                        "log": "${REAL_IP.__id} in blocking"
                    }
                }
            }
        }
    ]
}

网站加载本规则后,爬虫请求被拦截,且被持续拦截。

反爬方防护成功。

ROUND 5

爬虫方在上一轮对抗中,因使用 Selenium + WebDriver 会将 WebDriver 属性设为真,对方可据此属性值对爬虫进行拦截。采用如下设置即可修改 WebDriver 的值:

代码语言:txt
AI代码解释
复制
Object.defineProperties(window.navigator,{webdriver:{get:()=>false}})

爬虫方每次使用 Selenium + WebDriver 进行爬取前,预先执行一下这段 js 代码,即可成功爬取网页内容。

反爬方对应的防护规则因 WebDriver 值被人为更改而失效,继而尝试增加字体反爬规则。

规则背景是,在爬虫与反爬示例中,字体文件会产生一个 *.woff 的请求:

图6
图6

以测试页面 niushop 项目首页为例,对价格进行字体反爬处理:

图7
图7

规则如下:

图8
图8

网站加载此规则后,爬虫方获取的价格显示为乱码。

反爬方防护成功 (价格信息)。

ROUND 6

爬虫方受制于字体反爬规则,爬取价格信息时得到的是乱码。于是,在网站字体文件不变的情况下,直接解析固定的 woff 文件——

使用 Python 下 fontTool 库的 ttLib 包,破解反爬的代码文件与效果如下:

图9
图9
图10
图10

爬虫方成功获取网页信息 (准确的价格信息)。

反爬方升级字体反爬规则,以应对爬虫方借字体文件对乱码所做的还原,升级思路是“字体信息不换,动态更换字符编码”——

1. 使用 fontCreator 软件对字体文件进行编码和位置的修改,并产生多个“编码各不相同”、“字体顺序各不相同”和“位置各不相同”的 woff 文件:

图11
图11
图12
图12

2. 在规则中随机调用这些字体文件。这里生成了 5 个随机 woff 文件 (实际字体坐标点信息不变),在生产环境甚至可以制作 1000 个或更多。规则如下:

图13
图13

3. 效果是,多次请求获取到不同的 woff,且价格数值显示正常:

图14
图14
图15
图15

这一措施是利用随机 woff 文件增加爬虫难度。对爬虫方来说,由于 woff 文件中的对应关系变为随机,原先的爬虫程序失效。

反爬方防护成功 (价格信息)。

ROUND 7

爬虫方因防守方升级字体反爬规则,而原有脚本需要对每一个 woff 进行信息映射。如果运行原有脚本,会出现错误的价格数值,测试结果如下:

图16
图16

攻击方需加码升级爬虫脚本,根据“同一个字符其字体关键点的坐标是不变的”的逻辑爬取网页。爬取的代码文件如下:

图17
图17

多次访问验证效果,可以获取原有价格数值:

图18
图18

此时,爬虫方可以成功获取网页信息 (准确的价格信息)。

反爬方由于升级后的字体反爬规则被破解,需要继续升级规则。思路:在已有的动态编码的基础上,追加一个动态字体坐标 (以不影响页面字体显示为前提,微调字体的坐标点,类似于验证码中字体的扭曲变形)。通过微调字体形状 (反映在坐标点上),网站可以做出 1000+ 种字体文件,本文测试中设置出 20 种 (0-19) 字体文件用于随机。

图19
图19

部署后访问页面,价格信息可以正常显示。而爬虫方由于字体本身信息被微调,脚本再次失效。

反爬方防护成功 (价格信息)。

ROUND 8

爬虫方针对字体爬虫脚本的失效,可以发展出两种破解方案:一个是 OCR 技术 (Optical Character Recognition,光学字符识别),另一个是 KNN 算法 (K 近邻分类 K-Nearest Neighbor Classification)。

此处使用 KNN 算法尝试破解。

1. 测试文件地址:

图20
图20
图21
图21

2. 首先,font.py 脚本从网站中下载 5 个随机 woff 文件,存储到 fonts 目录中,并修改 font.py 脚本中所代表的字体值 (根据下载的 woff 文件在 fontCreator 中的顺序修改),如下:

图22
图22

3. 而后,执行 python3 knn_test.py,看到预测率为 100%,如图:

图23
图23

4. 接下来,预测并替换原响应内容,得到正确内容:

图24
图24

可以看到,爬虫方成功获取了信息。

反爬方字体反爬规则对 KNN 算法失效。此时,在字体上的反爬措施也已经走到尽头。防守需转换阵地,对相关网页内容进行 js 混淆,使用 JavaScript-Obfuscator 开源项目进行加密测试。

在本文的测试环境下,通过 cli 命令对 handle_init_js.js 文件进行混淆:

代码语言:txt
AI代码解释
复制
javascript-obfuscator/bin/javascript-obfuscator handle_init_js.js -o a_out.js --compact false
图25
图25

由于网页信息做了 js 混淆处理,爬虫方需要先解密混淆的 js 代码。如果爬虫方无法解密混淆后的 js 代码,则网站反爬防护成功。

ROUND 9

爬虫方一旦其一步步吃透了混淆后的 js 代码,同样可以成功爬取网页信息。

反爬方需继续改变应对策略,增设图片反爬规则。

这里有两种方式:

方式一:将敏感文字信息以图片形式显示,并设置图片加扰等措施。效果和规则如下:

图26
图26
图27
图27

方式二:svg 图片与 css 样式偏移显示结合,进行反爬。效果和规则如下:

图28
图28
图29
图29

由于价格以图片显示,能爬取的只有图片链接和 html 标签信息,并不能直接获取价格信息。在爬虫方难以进一步做图片识别的情况下,可视为对网站进行了成功的反爬防护。

ROUND 10

爬虫方:上回合里,价格以图片方式呈现,爬虫方无法直接获取价格信息,故需要使用 OCR 技术来获取图片中的内容。

以 Tessarect(c++) 开源项目为例 (地址),安装命令为:

代码语言:txt
AI代码解释
复制
./autogen.sh && ./configure && make && make install && ldconfig
git clone https://github.com/tesseract-ocr/tessdata.git
export TESSDATA_PREFIX=/usr/local/pachong/ocr/tesseract/tessdata/

测试如图所示:

图30
图30

可以看到,图片内容被准确识别出来,爬虫成功获取到了价格信息。

反爬方:网页终究是提供信息供用户阅览的,当爬虫方使用 OCR 技术进行图片识别的时候,网站暂时是没有更好的办法进行反爬防护的。当然,还可以继续跟爬虫方在图片显示技术上进行对抗,譬如使用图片水印对原信息进行处理。网页终究是要呈现信息给用户的,当走到爬虫方使用 OCR 技术进行图片识别这一步时,网站暂时是没有更好的办法进一步反爬的。当然,还可以继续跟爬虫方在图片显示技术上进行对抗,譬如使用图片水印对原信息进行处理。

总结

正所谓,“道高一尺魔高一丈”,爬虫和反爬的对抗始终斗智斗勇,步步紧逼,相互间的博弈没有终点。

(张戈 | 天存信息)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WEB安全新玩法 [3] 防护交易数据篡改
在任何涉及交易的系统中,客户与商家之间的交易数据具有核心作用,如购买商品的价格、数量、型号和优惠券等。在客户挑选商品的过程中,这些交易数据逐渐形成;待客户提交订单时,交易数据被商家接收,形成双方认可的订单。交易数据在形成过程中必须要有可靠的临时存储,而不可靠的存储会允许攻击者提交伪造的交易数据,使商家利益受损。
天存信息
2021/06/24
1.8K0
WEB安全新玩法 [3] 防护交易数据篡改
WEB安全新玩法 [11] 防范批量注册
网站的攻击者通过批量注册用户,能够实施大规模非法操作,如抢优惠券、恶意刷单等。这给服务商造成了直接的经济损失,而大量的垃圾用户也会占用系统资源,增加系统运行压力。防范批量注册需要针对系统特点,多管齐下综合应对,iFlow 业务安全加固平台可以提供各种防范批量注册的技术实现方式。
天存信息
2021/08/03
1.1K0
WEB安全新玩法 [11] 防范批量注册
抓取大站数据与反爬策略
大家想知道怎么抓取大站的数据还不被反爬,这个问题挺不错的。根据以往我的经验总结下来,步骤大致分为这几步:伪装请求头、使用代理IP、控制请求频率、处理动态内容、应对验证码、绕过JS检测、解析加密数据、遵守法律。每个部分都要结合搜索结果里的不同网页内容。
华科云商小徐
2025/05/09
1100
反爬篇 | 手把手教你处理 JS 逆向之字体反爬(下)
上一篇文章我们使用 Scrapy + Selenium 爬取了某个电影网站即将上映的影片
AirPython
2023/08/22
7010
反爬篇 | 手把手教你处理 JS 逆向之字体反爬(下)
Python爬虫遇到字体反爬?教你搞定!
大家在使用Python爬虫时,经常会遇到各种反爬问题。今天就以猫眼电影为例,看看如何解决其中的 字体反爬 !
快学Python
2021/08/09
7260
WEB安全新玩法 [4] 防护邮箱密码重置漏洞
大部分具有账号系统的应用都会提供重置用户登录密码的功能,常见方式之一是:用户输入自己的邮箱地址或手机号,应用向这个邮箱或手机号发送验证码,用户将收到的验证码输入应用中即可完成密码重置。这一过程容易因设计不周全而被攻击者加以利用。iFlow 业务安全加固平台可以为设计不当的应用打上动态虚拟补丁,使之防御可能的恶意利用。
天存信息
2021/06/28
2.4K0
WEB安全新玩法 [4] 防护邮箱密码重置漏洞
网站有反爬机制就爬不了数据?那是你不会【反】反爬!道高一尺魔高一丈啊!
不知道你们在用爬虫爬数据的时候是否有发现,越来越多的网站都有自己的反爬机制,抓取数据已经不像以前那么容易,目前常见的反爬机制主要有以下几种:
全栈程序员站长
2022/09/05
1.2K0
WEB安全新玩法 [5] 防范水平越权之查看他人订单信息
水平越权是指系统中的用户在未经授权的情况下,查看到另一个同级别用户所拥有的资源。水平越权会导致信息泄露,其产生原因是软件业务设计或编码上的缺陷。iFlow 业务安全加固平台可以缓解部分场景下的水平越权问题。
天存信息
2021/06/29
1.1K0
WEB安全新玩法 [5] 防范水平越权之查看他人订单信息
教你解决禁止F12、调试Debugger、丑化JS等反爬
在爬取数据时,有一些网站设置了反爬(禁止F12、网页调试Debugger、丑化Js),比如下面这几种情况:
Python研究者
2021/05/13
9.4K1
教你解决禁止F12、调试Debugger、丑化JS等反爬
WEB安全新玩法 [8] 阻止订单重复提交
交易订单的重复提交虽然通常不会直接影响现金流和商品流,但依然会给网站运营方带来损害,如消耗系统资源、影响正常用户订单生成、制造恶意用户发起纠纷的机会等。倘若订单对象是虚拟商品,也有可能造成实际损失。订单重复提交的检查工作本应该由网站自身实现,而 iFlow 业务安全加固平台则可以为未实现这项功能的网站提供防护。
天存信息
2021/07/28
1.6K0
WEB安全新玩法 [8] 阻止订单重复提交
一起看看这几个网站是如何反爬的 。
因为 Python 语法简介以及强大的第三方库,所以我们使用它来制作网络爬虫程序。网络爬虫的用途是进行数据采集,也就是将互联网中的数据采集过来。
小小詹同学
2019/11/13
2.8K0
Python常见的反爬手段和反反爬虫方法
这里要切记,人力成本也是资源,而且比机器更重要。因为,根据摩尔定律,机器越来越便宜。而根据IT行业的发展趋势,程序员工资越来越贵。因此,通常服务器反爬就是让爬虫工程师加班才是王道,机器成本并不是特别值钱。
北山啦
2022/11/27
1.2K0
爬虫与反爬虫技术简介
互联网的大数据时代的来临,网络爬虫也成了互联网中一个重要行业,它是一种自动获取网页数据信息的爬虫程序,是网站搜索引擎的重要组成部分。通过爬虫,可以获取自己想要的相关数据信息,让爬虫协助自己的工作,进而降低成本,提高业务成功率和提高业务效率。
2020labs小助手
2022/09/20
9100
2019年末逆向复习系列之从猫眼字体反爬分析谈谈字体反爬的前世今生
这篇文章是公众号《云爬虫技术研究笔记》的《2019年末逆向复习系列》的第六篇:《从猫眼字体反爬分析谈谈字体反爬的前世今生》
netkiller old
2019/12/13
1.1K0
2019年末逆向复习系列之从猫眼字体反爬分析谈谈字体反爬的前世今生
手把手教你JS逆向搞定字体反爬并获取某招聘网站信息
网站的反爬措施有很多,例如:js反爬、ip反爬、css反爬、字体反爬、验证码反爬、滑动点击类验证反爬等等,今天我们通过爬取某招聘来实战学习字体反爬。 今日网站
Python进阶者
2021/12/01
8350
手把手教你JS逆向搞定字体反爬并获取某招聘网站信息
Python爬虫实例:爬取猫眼电影——破解字体反爬
字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的。
丹枫无迹
2019/01/22
1.4K0
00. 这里整理了最全的爬虫框架(Java + Python)
网络爬虫技术在信息时代的大数据时代中变得越来越重要。它是一种从互联网上获取数据的技术,被广泛应用于搜索引擎、数据挖掘、商业情报等领域。
有一只柴犬
2024/06/28
9690
00. 这里整理了最全的爬虫框架(Java + Python)
字体反爬之实习僧
炎热的暑假过后,就是新一轮的春招了,甚至很多公司都已经开始了提前批招聘。在正式进入职场之前,找一份实习来提升自己对工作,对岗位的熟悉程度也是非常有必要的。今天我们就来爬取一下实习僧的岗位招聘数据吧!
老肥码码码
2020/01/17
1.3K1
字体反爬之实习僧
网络字体反爬之起点中文小说
前几天跟同事聊到最近在看什么小说,想起之前看过一篇文章说的是网络十大水文,就想把起点上的小说信息爬一下,搞点可视化数据看看。这段时间正在看爬虫框架-pyspider,觉得这种网站用框架还是很方便的,所以今天就给大家带来这篇---起点中文网小说爬取。可视化我们放到下一集。
星星在线
2018/08/21
1.3K0
网络字体反爬之起点中文小说
python爬虫-selenium破解封IP+TensorFlow机器人AI技术破解网页加密
python爬虫-selenium破解封IP+pytesseract破解验证码+AI破解网页加密
孔雀
2018/11/22
4.9K0
python爬虫-selenium破解封IP+TensorFlow机器人AI技术破解网页加密
推荐阅读
相关推荐
WEB安全新玩法 [3] 防护交易数据篡改
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档