如何保护REST服务的"公共"部分免受垃圾邮件侵害?

Ria*_*iaz 17 security authentication rest sinatra

我有一个相当完整的REST服务,将与iOS应用程序一起使用.它是使用Ruby/Sinatra构建的,但我认为这并不重要.

我正在使用基于SSL的HTTP基本身份验证来处理各种端点,而且这部分工作得非常好.

问题是:如何阻止垃圾邮件发送者等调用未通过HTTP基本身份验证保护的REST服务部分?

示例:用户注册

我们假设REST调用是(POST) .../register_account传递正文中的JSON对象.

出于显而易见的原因,此调用不能指望链接到用户帐户的用户名/密码.

想法是:

1)应用程序有自己的"用户名"/密码,有些调用会检查应用程序凭据.问题:植入设备等可以挖掘出这些凭据.

2)应用程序通过HTTP标头将秘密令牌传递给REST服务以进行这些调用.问题:与(1)相同

是否有任何常用的技术来阻止此类垃圾邮件呼叫?我想也许可以在混合中引入iPhone的设备ID,但还没有找到明确的方法.

谢谢

cde*_*zaq 7

虽然特定于应用程序的代码对于防御垃圾邮件的第一道防线是个好主意,但您仍应对您关注的任何服务实施一些限速.

例如,如果在REST服务上使用会话,则可以轻松限制从单个会话处理的呼叫数.该会话根本不需要进行身份验证,仅用于在发出请求时标识单个客户端.如果他们尝试在没有开放会话的情况下进行连接,那么简单地重定向回所请求的服务就是所需要的,而且几乎所有的Web框架或堆栈都内置了这个.

您还可以对其他属性(如IP或用户代理指纹)进行速率限制,但这些属性不如基于会话的方法可靠.


小智 6

一般来说,一种常见的方法是 API 密钥,它与您上面描述的秘密令牌相同。您可以将其硬编码到您的应用程序中,并使其他人很难对其进行逆向工程(隐藏它,从存储在应用程序中不同位置的各个部分构建它,等等)。您是正确的,因为坚定的攻击者将能够恢复密钥(如果您的应用程序可以这样做,则有权访问您的应用程序的其他人也可以)...但是您可以使其变得更加困难,希望它不会不值得花费时间和精力这样做。

您还可以考虑部署相互验证的 SSL,以便您的服务器将仅接受来自您的应用程序的传入连接,并且您的应用程序将仅与您的服务器进行通信。

这是高级方法。创建自签名服务器 SSL 证书并部署在您的 Web 服务器上。然后创建一个自签名客户端并将其作为资源部署在您的应用程序中。将服务器配置为需要客户端 SSL 身份验证并仅接受您生成的客户端证书。将客户端配置为使用该客户端证书来标识自身,并且仅接受您在服务器上安装的该部分的一个服务器端证书。

如果您的应用程序以外的某人/某物尝试连接到您的服务器,则不会创建 SSL 连接,因为服务器将拒绝不提供您已包含在应用程序中的客户端证书的传入 SSL 连接。

  • 您可以花几天时间编写逻辑来“隐藏”API 密钥并将其各个部分分布在您的应用程序中,但最终应用程序发出请求,只需检查网络日志以查看带有密钥的 url本身。这在网络应用程序中尤其简单,只需检查任何浏览器的开发工具中的“网络”选项卡,但在移动设备上也很容易做到这一点。 (9认同)