Security 如何保护';公共';来自垃圾邮件的REST服务的一部分?

Security 如何保护';公共';来自垃圾邮件的REST服务的一部分?,security,authentication,rest,sinatra,Security,Authentication,Rest,Sinatra,我有一个相当完整的REST服务,将与iOS应用程序一起使用。它是使用Ruby/Sinatra构建的,但我认为这在这里并不重要 我正在为各种端点使用基于SSL的HTTP基本身份验证,这一部分工作得非常好 问题是: 如何阻止垃圾邮件发送者等调用REST服务中未通过HTTP基本身份验证保护的部分 示例:用户注册 假设REST调用是(POST)../register\u account在主体中传递JSON对象 由于明显的原因,此调用不能期望用户名/密码链接到用户帐户 这些想法是: 1) 该应用程序有自己

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

我正在为各种端点使用基于SSL的HTTP基本身份验证,这一部分工作得非常好

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

示例:用户注册

假设REST调用是(POST)../register\u account在主体中传递JSON对象

由于明显的原因,此调用不能期望用户名/密码链接到用户帐户

这些想法是:

1) 该应用程序有自己的“用户名/密码”,一些调用会检查应用程序凭据。 问题:对设备等进行根操作可能会发现这些凭据

2) 应用程序通过HTTP头将一个秘密令牌传递给这些调用的REST服务。 问题:与(1)相同

有没有什么常用的技术来防止此类垃圾邮件呼叫?我想也许会在混合中引入iPhone的设备id,但还没有确定一个明确的方法


谢谢

您可以使用
request.ip
跟踪ip地址,并编写相关逻辑。

虽然特定于应用程序的代码是防范垃圾邮件的第一道防线,但您仍然应该对您关心的任何服务实施一些速率限制

例如,如果在REST服务上使用会话,则可以轻松地对单个会话中处理的呼叫数进行分级限制。会话根本不需要进行身份验证,只用于在客户端发出请求时识别单个客户端。如果他们试图在没有打开会话的情况下连接,只需简单地重定向回请求的服务,实际上所有web框架或堆栈都内置了此功能


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

通常,常用的方法是API密钥,它与您上面描述的秘密令牌相同。您可以将其硬编码到您的应用程序中,并使某人难以对其进行反向工程(隐藏它,使用存储在应用程序中不同位置的不同部分构建它,等等)。你是正确的,一个有决心的攻击者将能够恢复密钥(如果你的应用程序可以恢复密钥,其他有权访问你的应用程序的人也可以恢复密钥)……但是你可以在不值得花费时间和精力的情况下使恢复变得更加困难

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

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


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

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


将秘密建立在手机独有的东西上,只有你自己知道那是什么。服务器端也必须知道这种唯一性。

错;NAT背后有很多人,因此大量不相关的请求可以来自单个IP。但我可以将移动/平板电脑设备id和IP组合成一个散列,生成一个唯一的令牌进行比较。我将使用这个gem:进行速率限制。我将对它进行子类化,以便客户端标识符是设备id+ip地址的组合。你可以花上几天的时间编写逻辑来“隐藏”API密钥,并将其各个部分散布到你的应用程序中,但在一天结束时,应用程序会发出请求,只需检查网络日志,查看带有密钥的url即可。这在web应用程序中尤其微不足道,只需在任何浏览器的开发工具中选中“网络”选项卡,但在移动设备上也很容易做到。