从非浏览器客户端安全REST API

时间:2014-02-14 22:22:59

标签: security rest client-server httprequest

我正在使用Java EE和一些开源组件(Spring,Struts 2,jQuery等)开发Web应用程序。我的一些网页需要身份验证(Spring Security),而其他网页则不需要。我编写了一些REST API(Restlet),我通过AJAX调用(jQuery)在我的页面中使用它们。我知道其他网站不能使用我的REST API,除非我启用了CORS,这就是我想要的。

但是,任何非浏览器客户端(curl,Java应用程序等)都可以调用我的REST API:我怎么能禁止这个?我不能对所有REST API使用身份验证,因为我在不应要求身份验证的网页中使用其中一些。我知道有些API(比如Facebook SDK)需要一个application-id来启用调用,但是任何人都可以从我的网页中包含的Javascript代码中窃取密钥。

我想从服务器端识别是否已从浏览器或其他客户端应用程序发送HTTP请求,以便仅在第二种情况下应用某种身份验证。我担心,任何客户端应用程序都可以设置任何HTTP标头,所以我不能HTTP标头,可以吗?我认为我的问题应该是一个常见问题,所以也许我会错过一些东西。

2 个答案:

答案 0 :(得分:2)

你无能为力。

大多数人担心未经授权的用户使用他们的应用程序。你担心未经授权的程序。

然而,程序需要与您的服务器进行通信的所有内容(由服务器在令牌中,或由用户在凭证中)告知。

为什么你害怕“非浏览器”客户?你为什么关心他们使用的客户?对于您的用例,非浏览器客户端与普通浏览器的区别如何?

回答这个问题,你会找到更好的答案。

你害怕他们会“屏蔽”你的网站,快速下载像wget这样的东西吗?然后你可以放入一些服务器端规则来控制他们的访问(如果IP x.y.z.w每个BLEEM时间发出超过Q个请求,那么丢弃请求/睡眠10s /发送内容真的很慢)。

这些措施是你必须要做的。您不能“保护”客户端,而不是您的客户端。您必须保护您的服务器,并解决问题。

记住客户端/服务器设计的规则#1:“永远不要信任客户端”。在互联网上,没有人知道你是机器人。

答案 1 :(得分:0)

一段时间以来,我一直在考虑这个问题,您的担心是很有效的。

限定符

我想出了一种解决方案,可以且仅当您的API供私人使用时,您才可以将其应用于API。

也就是说,供您自己的网站或您或组织拥有的一组网站和服务使用。为了进一步符合条件,它适用于不是供公众消费的API。

规则淘汰

  1. 考虑到在TLS上,浏览器在TLS上由浏览器发送的请求之外,绝对没有办法,Web服务器可以绝对保证请求确实已经到来来自客户。

    任何非浏览器客户端都可以在TUNNEL握手后查看浏览器发送的有效请求,并将所有必需的标头发送到服务器,服务器将无法知道这是哪种客户端以及此客户确实有效。

  2. 浏览器强加的同源策略限制是一个稻草人,并且不提供任何安全性。我制作了一些有关它的视频,但仍在探索更多视频中。

    Bug in Microsoft.AspNet.WebApi.Cors: Lets the request go through even if domain not whitelisted

    Addendum: Bug in Microsoft.AspNet.WebApi.Cors

    Root cause analysis: Bug in Microsoft.AspNet.WebApi.Cors library

但总而言之,您没有任何帮助,因此请不要依赖任何东西。

解决方案

我能想到的一种方法是让请求有效负载也成为请求授权过程中输入的一部分。

示例

例如,发送客户端凭证的摘要,该摘要可能由HTTP标头之一中的client_idclient_secret组成,然后让客户端代码使用{ {1}}。

我敢肯定,您可以在此方面构想其他示例。关键是让请求有效负载作为输入参与授权过程。

这样,即使攻击者从已拦截的有效请求的标头中窃取了承载令牌,也很难欺骗该请求。

因此,这不仅可以保护您免受伪造请求的攻击,而且还可以防止请求被中间人攻击(MITM)篡改。 MITM攻击者仍然可以读取您的HTTP请求和响应,但是他将无法对它们或读取的数据做任何事情。

相关问题