如何限制 AJAX API 不被不必要的使用(例如某人执行 SELECT *)

Posted

技术标签:

【中文标题】如何限制 AJAX API 不被不必要的使用(例如某人执行 SELECT *)【英文标题】:How to restrict AJAX API from unwanted use (e.g. someone performing a SELECT *) 【发布时间】:2020-07-05 12:23:40 【问题描述】:

我有一个餐厅定位器网络应用程序,它将餐厅的位置与 Google 地图融合在一起。

我使用 JQuery 滑块通过搜索过滤器来限制在地图上显示的餐厅数量,例如:价格、食物类型、区域设置。

这些 JQuery 滑块通过 AJAX 回调我为更新地图而创建的 API,而无需刷新网页。

JQuery 像这样调用 RESTFUL API:

http://example.com/search/?city=NYC&max-price:50&cuisine=french

这将返回与此条件匹配的餐厅的 JSON 字符串,以便我的 Web 应用程序可以在地图上显示与搜索匹配的所有餐厅。

我不希望有人出现并找出我的 API 并转储我所有的餐厅列表。

有没有一种方法可以限制谁调用上述 HTTP API,以便只有我的网络服务器调用 URL 而不是垃圾邮件/黑客想要转储我的数据库?

谢谢

【问题讨论】:

您可以记录他们是谁在服务器端,并且每 X 秒只处理一次来自用户的转储请求。 这个帖子好像和我问的一样 --> ***.com/questions/856045/how-to-restrict-json-access 【参考方案1】:

首先,在robots.txt 中声明您的意图。

然后,在主页上发送一个带有 nonce 或某种唯一 ID 的 Set-Cookie 标头,而不是在您的 API 响应上。如果 cookie 从未发送到您的 API 端点,请返回 401 Bad Request 响应,因为它是机器人、非常损坏的浏览器,或者有人拒绝了您的 cookie。 Referer 标头也可以用作附加检查,但它很容易伪造。跟踪该 ID 进行了多少 API 调用。您可能还希望将 ID 与 IP 地址相匹配。如果超过您的阈值,请回复403 Forbidden 响应。让您的门槛足够高,以免合法用户被抓住。

保持良好的日志,并突出显示 401 和 403 响应。

实际上,如果某人有足够的决心,他们将能够转储此信息。你的目标不应该是让这成为不可能,因为你永远不会成功。 (请参阅有关实现完美安全性的所有常见格言。)相反,您希望非常清楚地表明:

此行为违反了服务条款。 您正在积极尝试防止这种情况发生。 您知道罪犯的存在以及他们的大致身份。 如果这种情况继续下去,可怕的律师可能会开始介入。

(你确实有律师,对吧?)

要实现这一点,请确保您的 403 Forbidden 响应的正文传达了一条听起来很吓人的消息,类似于“此请求超出 API 的最大允许使用量。您的 IP 地址已被记录。请参阅条款服务并遵守robots.txt 中的指令。”

IANAL,但我相信如果您对自己的数据库声明版权,DMCA 可以适用于这种情况。这实质上意味着,如果您可以跟踪对 IP 地址的非法使用 API,您可以向他们的 ISP 发送 nastygram。当然,这应该是最后的手段。

我不鼓励使用分配的 API 密钥/令牌,因为事实证明它们会成为采用的障碍,而且管理起来有点麻烦。作为与@womp 的回答相反的一点,谷歌正在慢慢停止使用它们。另外,我认为它们实际上并不适用于这种情况,因为听起来您的“API”更像是主要在您自己的网站上使用的 JSON 调用。

【讨论】:

HOST 头是不是也很容易伪造?【参考方案2】:

所有大型 REST API 都倾向于使用令牌化身份验证 - 基本上在您执行 REST 请求之前,您必须向令牌服务发送一些其他请求以获取要包含在您的数据请求中的令牌。 Bing Maps 这样做,Amazon 这样做,Flickr 这样做......等等。

除了使用 Bing Maps 之外,我对此了解不多。您需要阅读使用 REST 的令牌化身份验证。这是一篇帮助您入门的博文:http://www.naildrivin5.com/daveblog5000/?p=35

【讨论】:

以上是关于如何限制 AJAX API 不被不必要的使用(例如某人执行 SELECT *)的主要内容,如果未能解决你的问题,请参考以下文章

如何防止网站不被SQL注入攻击

在烧瓶中保护 REST api

如何使用 Ajax 显示 API 数据?

如何让试用程序使用期限限制不被破解

ajax常用实例代码总结参考

可以向 Google Maps API 发出多少请求而不被禁止?