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

时间:2012-01-20 19:17:46

标签: security authentication rest sinatra

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

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

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

示例:用户注册

假设REST调用(POST) ... / register_account 在正文中传递JSON对象。

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

想法是:

1)应用程序有自己的“用户名”/密码,有些调用会检查应用程序凭据。 问题:生根设备等可以发掘出这些凭据。

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

相同

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

由于

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

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

您还可以查看部署经过相互身份验证的SSL,以便您的服务器只接受来自您应用的传入连接,而您的应用只会与您的服务器进行通信。

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

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

答案 2 :(得分:0)

这确实很旧,但您可以做一些事情。我会创建一个基于时间的秘密令牌。您可以随请求一起发送的在几秒钟内到期的内容。由于您的 iOS 应用程序源代码不是公开的,因此您需要对其进行保密。您需要确保您的时间在应用程序和服务器之间同步。您可以将时间从移动应用程序发送到服务器并计算偏移量(如果有)。这将防止您的应用以外的任何内容在您通过身份验证之前与您的 API 通信。

秘密基于手机独有的东西,只有您知道那是什么。服务器端也必须知道这种唯一性。

答案 3 :(得分:-2)

可以使用request.ip跟踪IP地址,并围绕该地址编写一些逻辑。