保持API调用私有/受保护

问题描述:

我正在研究一个大多是静态的Web应用程序 - 只是HTML/CSS/JS +资产。我正在使用Rack服务器(实际上是Thin)来提供服务。保持API调用私有/受保护

虽然该应用程序大部分是静态的,但有一些服务器端需求一直出现。由于应用程序需要通过JavaScript与这些需求进行交互,因此我已经将Sinatra添加到堆栈中,以便我可以轻松设置一些路线以充当简单的API。

一个这样的API调用是发送电子邮件 - 网络应用程序需要一种发送电子邮件给用户的方式。我设置了一个可以使用包含JSON对象的POST调用的路由(/ api/mail),Ruby将发送一封电子邮件(通过SendGrid)。

这是我的问题 - 本质上,这些API调用是公开的。大多数情况下,这很好 - 但通过电子邮件API,我想保护它,以便没有人可以通过简单POST开始发送恶意电子邮件,冒充我的应用程序。

问题是,我不太清楚如何验证这一点。 Web应用程序本身就是客户端,而不是用户,所以密码或API密钥似乎毫无价值,因为任何人都可以嗅探POST标头并获取应用程序发布到API的凭据。

正在加密一切通过SSL我唯一的选择,还是我错过了一些明显的解决方案?

+1

SSL如何帮助您?你想从谁那里保护什么? – ykaganovich 2012-04-26 05:41:34

+0

我试图通过能够进行简单的公共POST调用来防止匿名用户劫持我的电子邮件API。我不希望任何人能够发送任何他们想要的电子邮件,原因有两个 - 它会很昂贵,并且会有安全风险(恶意用户冒充我的应用程序)。我认为可以在POST中传递一个API密钥(或密码或其他东西),以验证它是我的网站进行的呼叫,但它需要SSL加密以防止窥探POST头中的密钥。 – redhotvengeance 2012-04-26 05:46:07

+0

SSL将服务器认证到客户端,并保持传输中的数据加密。但它不验证客户端。任何人都可以(a)打开浏览器并查看表单页面中嵌入的API密钥,或者(b)编写脚本下载表单页面并以编程方式获取。您可以密码保护您的API的访问权限(所以它基本上不再公开),但这只是表示您相信谁在您的系统上拥有帐户。我认为最基本的问题是,你想要把这个API称为谁。 – ykaganovich 2012-04-26 06:27:03

在一天结束时,你所做的任何事情都可以很容易地被刮掉。我会通过ip和会话进行一些积极的速率限制,不要认为其他任何事情都是可能的(或有效的)

+0

即使使用SSL,POST调用也可能被刮掉? – redhotvengeance 2012-04-26 05:41:26

+0

@idollar与SSL,你的网络内的流量是加密的,但如果有人写了一个浏览器机器人,比在这种情况下,你必须在服务器端做一些检查,如马特所说。 – Adeel 2012-04-26 05:45:25

+0

@Adeel那么,我可以实现哪些服务器端检查来验证它是我的应用程序进行的调用,而不是一些随机用户进行POST?速率限制并不是一种解决方案,因为我不希望任何人使用电子邮件API恶意构成我的应用程序,无论是1次还是1000次。 – redhotvengeance 2012-04-26 05:49:42