保护Web API免受未经授权的应用程

Pab*_*bio 11 ajax obfuscation web-services

我正在开发一个使用大量AJAX与服务器通信的网页.反过来,服务器具有广泛的REST/JSON API,公开Web客户端调用的不同操作.

匿名用户和经过身份验证的用户都使用此Web站点.正如您所料,经过身份验证的用户发出的Web服务调用需要身份验证,因此可以防止未经授权的用户或应用程序.

但是,该网站具有许多不需要身份验证的功能,其中一些功能使用匿名Web服务.我用来阻止外人调用此Web服务的唯一方法是使用CSRF令牌.我知道,CSRF令牌在这方面并不是很有用......有了一些时间,即使他们使用CSRF令牌,您也可以弄清楚如何使用Web服务.

当然,您可以使用CAPTCHA来防止应用程序或机器人自动使用您的Web服务.但是,任何人都可以使用它.

另一方面,在客户端和服务器之间共享密钥将是无用的.这是因为任何局外人都有能力从网页源代码中读取它.

我想使这些Web服务难以调用为任何第三方应用程序.除了使用CSRF令牌,你会做什么?这听起来有点愚蠢,但嘿,也许这是愚蠢的,我只是在浪费我的时间.

注意:鉴于此应用程序使用浏览器而不是"可执行文件"作为客户端,此问题与讨论无关.我不能在服务器和客户端之间使用秘密(至少我不知道)

exp*_*nit 1

您可能遇到比链接问题中描述的问题更简单的问题,因为您不需要向用户分发二进制文件。即使您的应用程序是开源的,HMAC/签名密钥(在该答案的“请求签名”部分中)也可以通过环境/配置设置进行控制。

总结一下:

  1. 密钥实际上并未在客户端和服务器之间发送。相反,它用于签署请求
  2. 确保请求包含一些唯一/随机元素(您的 CSRF 密钥可能就足够了),以便对相同 API 数据的两个请求不相同。
  3. 使用密钥对请求进行签名并将签名附加到请求中。您链接到一个 PHP 问题,但不清楚您使用的是什么语言。在 .Net 中,我将使用HMAC类,例如HMACSHA256
  4. 在 API 服务器端使用相同的 HMAC 对象来验证请求是否使用相同的密钥进行签名。