如何避免未经授权使用API​​?


10

我必须设计一个“小部件”,一个脚本,合作伙伴将其嵌入到他们的网站中以显示一些UI并调用我们的API。

基本上,它将根据API调用中提供的一些ID在这些网站上显示我们的数据。我们要避免的是有人滥用API并使用它来刮擦我们的整个目录。

嵌入脚本的每个合作伙伴都将获得一个公开密钥,在调用API时必须提供该公开密钥。一个想法是让他们在加载脚本时附加此密钥,例如:

<script src="//initrode.com/widget/loader.js?key=xxxx"></script>

这样,对脚本的请求可用于注册密钥/源IP对,并仅在密钥/ IP对与已注册的密钥/源IP对匹配(生命周期有限且每天的请求受到限制)时才应答后续的API调用。

我不确定这是个好主意,因为通过混淆显然是安全的(有人重新加载脚本会完全绕过它);但我没有其他限制访问的方法。我不能为每个用户提供唯一的密钥,只能给合作伙伴提供。我不能使用私钥系统,因为任何人都可以使用所有代码。它基本上是限制对公共API的访问,即在定义上是矛盾的。

您如何看待该解决方案,您将如何应对这些约束?


您可以使密钥动态化吗?伙伴标识符的MD5哈希值加上UTC时间四舍五入到最接近的10分钟?
Dan Pichelman

2
我可以,但是可以在脚本中计算得出,因此任何人都可以免费复制它。我看不到如何提高安全性。
Antoine 2014年

我当时正在考虑让合作伙伴在服务器端进行计算。如果这不是一个选择,那么我怀疑您唯一真正的选择是执行您提到的限制(有限的生命周期,每天的请求数限制)。不要忘记,您看到的IP不一定映射到一台计算机。
Dan Pichelman 2014年

我需要检查业务是否可以在服务器端进行计算。否则,这就是我所担心的,唯一的解决办法就是节流。
Antoine

Answers:


12

您需要几种保护。

首先,您需要防止在站点B上使用站点A的密钥。

从理论上讲,如果键绑定到域,则不能依赖referer标头,但是由于您是客户端直接嵌入脚本,因此可以合理地依赖document.location客户端。直接将该位置(或部分位置)发送到服务器是不可靠的;但是您可以使用它来生成会话密钥:

  1. 客户端嵌入client_key对API库的请求。
  2. 服务器确定有权访问API的主机(如果有)。
  3. 服务器为会话密钥选择“盐”,并将其发送到带有库的客户端(或作为另一个预身份验证交换的一部分)。
  4. 客户端计算出session_keyusing hash(document.location.host + session_salt)
  5. 客户端使用session_key+ client_key进行API调用。
  6. Server通过在会话中查找client_key主机和“盐”,计算哈希值并与提供的进行比较,以验证呼叫client_key

其次,您需要阻止Hacker Hank打开调试控制台或在站点A上使用经过修改的客户端来完成他想对您的API进行的操作。

但是请注意,要完全阻止 Hacker Hank滥用API 是非常困难的,即使不是不可能的。但是,您可以使其更加困难。我知道,阻止Hank的最合理方法是限制速率。

  • 限制请求数/秒/会话和请求数/小时/会话。(活动的峰值可能是合理的,但不能使单个客户端的流量持续高于平均水平。)
  • 限制会话数/ IP /小时。
  • 限制请求数/ IP /小时。允许峰值,但不能承受来自单个IP的大量流量。

第三,您可能已经在做:对流量进行加密。当然,NSA会看到的。但是Hacker Hank的可能性较小。


0

听起来您在这里做的就是将您的JavaScript文件变成受保护的资源。并同时将其与某种令牌生成捆绑在一起。那很有意思。

与我一起工作的安全人员通常会立即将IP地址丢弃,因为IP是可欺骗的。但是,如果您将IP限制与SSL结合使用,通常就可以解决问题。

但是您必须将IP地址“白名单”,否则任何黑客都可以进入前门。

我对此表示怀疑,但实际上我认为您的方案效果很好。如果1)使用TLS(即SSL或https)进行.js文件和后续API调用,并且2)将IP列入白名单。然后,我将大胆地声明,并说我认为您已经通过了安全审查,即使对于PCI(信用卡)交互也是如此。

恕我直言...但是,如果您只是尝试保护公司专有信息,而不是保护信用卡(PCI)或个人/私人信息(PII),那么即使没有SSL,这也可能很好,具体取决于您的身份愿意冒着暴露您的目录的风险。

或这样说:使用SSL,专门的黑客无法获取您的目录。(除非它们破坏了SSL,但随后它们也可能破坏了Amazon)。如果没有SSL,专门的黑客可能会嗅探您的电话,欺骗IP并删除您的目录。因此,这是对风险的判断。

我正在尝试一种免除IP白名单的方法,因为这通常很难管理;)而无需使用成熟的OAuth。我会面条的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.