保护您的数据 API 免受网络爬虫的攻击
我在网上做了很多数据抓取工作,首先要找的就是 API。即使平台没有提供公开文档的 API,通常他们也会提供一些未公开的“私有” API,以便于客户端和服务器之间的通信,例如搜索查询或其他有趣的 AJAX 操作,而无需重新加载页面。
事实上,由于它没有记录,可能存在很多他们可能不会想到的安全相关问题,仅仅是因为它不打算供公众使用(但更有可能的是,谁喜欢考虑安全问题?)
作为一个网络爬虫,我注意到的一件事是,自己发出 API 请求通常非常容易。
一个简单的例子
假设您有一个博客或其他内容系统,并且您想要实现一个搜索功能,用户输入一个搜索查询,然后您的服务器使用它从数据库返回相关结果列表。
请求
构建 API 后,您可能会在客户端发出如下请求:
POST https://api.myblog.com/search
query=scrape&type=tag
其目的是返回所有带有“scrape”标签的帖子。然后,您可以继续测试 API,验证其是否正常工作,并提交代码。
太棒了,干得漂亮!你发布了你的功能,现在你可以给你的帖子添加标签,方便大家使用标签搜索找到它们了。
刮刀
所以现在我来了,想把您网站上的所有帖子都列出来。或许我想建立一个自己的网站,基本上照搬您所有的内容(想想那些 Instagram 上的克隆版),这样不用费什么功夫就能享受到额外的流量。我真正需要做的就是定期运行爬虫程序,检查是否有新内容,然后下载到我自己的服务器上。
为了弄清楚你的网站是如何运作的,我会访问你的博客,输入搜索查询,然后点击提交。然后我会注意到你发出了一个 API 请求,并继续查看请求和响应是如何构造的:
- 标头,例如 cookies、origin、host、referer、user-agent、自定义标头等
- 主体,查看发送了什么数据
- 任何安全功能,例如 CSRF 令牌或授权
然后,我会复制此请求并从我自己的服务器发送,这样就可以绕过 CORS,因为如果我可以伪造来源,CORS 就没有任何意义。此外,很多人可能并不真正了解 CORS,也不会Access-Control-Allow-Origin: *
在他们的服务器上设置它,因为StackOverflow 上有一半的答案都推荐它作为解决方案。从概念上讲,它并不难理解,我强烈建议阅读相关内容,例如在 MDN 上。
一些糟糕的查询
我会先尝试不同的方法。比如尝试一个空字符串。
POST https://api.myblog.com/search
query=&type=tag
也许您的搜索引擎会匹配每个标签,然后一次性给我所有内容。
或者我可能会尝试一些通配符,也许%
或者*
希望你不要清理你的参数(这可能会打开一个不同的伤害世界!)
POST https://api.myblog.com/search
query=%&type=tag
解决方案???
一般来说,根据您所在的国家/地区,法律会站在您这边,因为您的服务条款会包含有关未经授权访问 API 的规定。如果您没有遵守,您或许应该遵守!当然,并非所有人都会遵守法律,而且根据您处理的数据类型,有时您可能需要更主动地阻止爬虫程序过快地窃取您的所有数据。
就像您的数据库遭到黑客攻击并泄露数百万客户数据会对您的业务造成巨大打击一样,即使您有权起诉黑客,您可能也不想等到它真正发生,以便您可以打出法律牌。
与保护数据库不同,您无法阻止他人向您的服务器发出请求。毕竟,如何区分来自您网站的请求和来自我用 Ruby、Python、Java 或直接用 curl 编写的第三方客户端的请求呢?
我认为这种情况的目的是让数据抓取工具更加努力地工作。它们工作越努力,需要发出的请求就越多,数据收集过程就越慢,你就越容易将其标记为可疑活动并自动采取行动。
根据内容的性质,例如,您可以强制执行最小字符数限制,并过滤输入以避免服务器端的通配符操作。检查的位置很重要,因为我自己构建请求,所以任何前端验证基本上都是无用的。依赖客户端的诚实就像把你的保险箱钥匙给我,却希望我打不开一样。
我在其他应用程序中见过的其他常见示例包括
-
限制每个时间间隔的请求数量(即请求冷却时间)。如果您的应用用户不想每秒发出 100 个请求,那就不要让他们这么做。
-
对结果进行分页。对于各种与性能相关的目的(无论好坏),这是一种非常常见的策略,但将其与请求冷却时间相结合,效果会非常好。
-
地理围栏策略,搜索结果会根据提供的位置进行限制,该位置可以是区域名称,也可以是一对经纬度坐标。这可能不适用于你,但如果适用,就会让爬虫程序的日子不好过。
-
速率限制,即限制 API 请求的数量,超过该数量后将无法再进行其他请求。如果请求必须使用令牌进行身份验证(令牌可能与用户帐户绑定),则此方法非常有用。如果我直接使用与你客户端相同的令牌访问服务器,则此方法将无效。
-
编译为本机代码。这种方法实际上非常有效,因为与任何人都能轻松理解的普通 JavaScript 不同,逆向本机代码需要的不仅仅是一些关于如何使用代码美化器和浏览器调试器的基本知识。当然,只要投入足够的时间和精力,他们仍然可以做到,但世界上大概 95% 的人不具备这种技能。
通过有效地使用过滤器和冷却时间,您可以迫使抓取工具努力获取您的数据,而不是只是进来然后在 5 秒内带走所有东西!
反馈
您是否喜欢使用什么技术来“保护”您的数据免遭爬虫攻击?或者,普通应用开发者可能不需要考虑这些技术?
文章来源:https://dev.to/mxldevs/secure-your-data-api-from-web-scrapers-1c5m