正如许多企业或爬虫用户所知,AWS WAF(Web 应用防火墙)是一个强大的安全解决方案,旨在保护 Web 应用免受常见的网络攻击和漏洞。其关键功能之一是使用 CAPTCHA 和挑战来区分合法用户和潜在的恶意机器人。虽然这增强了安全性,但也会为 Web 爬虫活动带来显著的障碍和一些不必要的麻烦。所以在本文中,我们将探讨 AWS WAF 中的 CAPTCHA 和挑战,并讨论如何克服这些障碍,以确保 Web 爬虫和企业活动顺利进行。
了解 AWS WAF 的 CAPTCHA 和挑战
众所周知,AWS WAF 通过 CAPTCHA 和挑战作为其防御机制的一部分,来防止自动化攻击和未经授权的访问。这些措施旨在验证与 Web 应用交互的用户是人类而不是机器人。例如,当您的 Web 爬虫活动中某个请求被认为是可疑时,AWS WAF 可能会向您展示 CAPTCHA 或挑战。
解决重复失败的令人烦恼的验证码吗?
发现无缝自动验证码解决方案,使用 Capsolver 的 AI 驱动自动 Web 解封技术!
使用 优惠码 领取顶级验证码解决方案;CapSolver: WEBS。兑换后,您将每次充值额外获得 5% 奖励,无限制。
- IP 匹配条件
Amazon WAF 可以使用无类别域间路由(CIDR)表示法为每个 IP 匹配条件配置最多 10,000 个 IP 地址范围。每个列表受此限制的约束。允许列表、拒绝列表(手动 IP 列表组件)和第三方 IP 阻止列表(IP 列表解析组件)是单独的列表,每个限制 10,000 个 IP 地址。可以手动修改允许和拒绝的 IP 集以根据需要添加或删除 IP 地址。
- 嵌入在 Web 应用中的蜜罐
将创建一个很少访问的端点作为蜜罐,以检测和转移内容抓取器和恶意机器人的入站请求。普通用户不会尝试访问此端点。但是,内容抓取器和恶意机器人(如扫描漏洞和抓取数据的恶意软件)可能会尝试访问蜜罐端点。在这种情况下,Amazon 将检查请求以提取其来源,然后更新相关的 Amazon WAF 规则,以阻止该 IP 地址的后续请求。
此外,AWS 通常有三种类型的验证码:
-
下面是一个图片网格拼图的示例。拼图要求您选择网格中包含特定类型对象的所有图片。
-
另一种常见的验证码是如下图所示,要求您确定绘图中汽车路径的终点。
-
最后一种是音频 CAPTCHA,它利用背景噪音叠加在语音上的原理。当然,与拼图一样,如果您有正确的方法,音频 CAPTCHA 也可以自动解决。
如何识别 AWS WAF?
- 请求 URL 的响应头检查
当请求一个 URL 时,如果响应状态码通常为 405 且响应头包含字段 X-Amzn-Waf-Action: captcha
和 X-Amzn-Errortype: ForbiddenException
,则表示当前访问被 AWS WAF 阻止。
- 响应 HTML 中的出现
当响应 HTML 包含诸如 awsWaf
、 captcha.awswaf.com
等信息时,表示需要进行 AWS 验证码处理。
<script type="text/javascript">
window.awsWafCookieDomainList = [];
window.gokuProps = {
"key":"AQIDAHjcYu/*****",
"iv":"CgAHfjMvRjAAAA3q",
"context":"MK7Z1IlZc****"
};
</script>
<script src="https://***.token.awswaf.com/***/challenge.js"></script>
<script src="https://***.captcha.awswaf.com/****/captcha.js"></script>
解决 WAF 的技巧
我们可以通过 CapSolver 实现合规的自动拼图解决。CapSolver 是一个提供验证码识别解决方案的服务。它为不同的验证码系统(包括 WAF)提供各种任务类型。
CapSolver 提供两种验证码解决服务,可以帮助您轻松解决 WAF。一个服务是使用 CapSolver 的 API,另一个是下载 扩展。
接下来按照我的步骤,看看如何在 Web 抓取中实现自动化解决方案,非常简单,让我们深入探讨!
步骤 1 登录
您可以 注册 CapSolver 并访问我们的 CAPTCHA 服务,目前支持免费试用。
步骤 2 获取您的免费 API!
注册后,您可以从主页面板获得您的 API 密钥。
代码示例
要通过代码获取有效的 aws-waf-token
,您可以使用 Python、Go、JavaScript 等主流语言,以下是使用 Python 获取的方法:
# pip install requests
import requests
import time
api_key = "YOUR_API_KEY" # TODO: your api key of capsolver
site_url = "https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest" # TODO: page url of your site
def capsolver():
payload = {
"clientKey": api_key,
"task": {
"type": 'AntiAwsWafTaskProxyLess',
"websiteURL": site_url
}
}
res = requests.post("https://api.capsolver.com/createTask", json=payload)
resp = res.json()
task_id = resp.get("taskId")
if not task_id:
print("Failed to create task:", res.text)
return
print(f"Got taskId: {task_id} / Getting result...")
while True:
time.sleep(1) # delay
payload = {"clientKey": api_key, "taskId": task_id}
res = requests.post("https://api.capsolver.com/getTaskResult", json=payload)
resp = res.json()
status = resp.get("status")
if status == "ready":
return resp.get("solution", {}).get('cookie')
if status == "failed" or resp.get("errorId"):
print("Solve failed! response:", res.text)
return
token = capsolver()
print(token)
很快,您将看到输出是所需的 aws-waf-token
Got taskId: 373a6363-c03f-48d5-85eb-05e553980a64 / Getting result...
2d8415fb-43ec-42c5-8106-c51194d5eb14:EQoAljIa3jkRAAAA:Z+bkUZcJEl90QIM46acsmio......
接下来,尝试看看 aws-waf-token
是否实际有效。
def check_website(token):
headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"accept-language": "en-US,en;q=0.9,sq;q=0.8,ak;q=0.7,ar;q=0.6,an;q=0.5,am;q=0.4,as;q=0.3,az;q=0.2,ast;q=0.1,ee;q=0.1,ay;q=0.1,ga;q=0.1,et;q=0.1,oc;q=0.1,or;q=0.1,om;q=0.1,eu;q=0.1,be;q=0.1,bm;q=0.1,bg;q=0.1,nso;q=0.1,is;q=0.1,pl;q=0.1,bs;q=0.1,fa;q=0.1,bho;q=0.1,br;q=0.1,tn;q=0.
1,fi;q=0.1,fr;q=0.1",
"cookie": token,
}
res = requests.get(site_url, headers=headers)
print(f"Got response {res.status_code}")
print(f"Cookies: {res.cookies}")
check_website(token)
结论
虽然 AWS WAF 的 CAPTCHA 和挑战可以有效防止恶意机器人,但也可能对合法的 Web 爬虫活动带来不便。然而,通过理解 AWS WAF 的工作原理并采用像 CapSolver 这样的解决方案,您可以绕过这些障碍,确保 Web 爬虫活动顺利进行。记住,安全和合规同样重要,因此在实施任何自动化解决方案时,请确保遵循相关的法律和道德准则。