security - 从非浏览器客户端保护 REST API

标签 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。我知道某些 API(例如 Facebook SDK)需要应用程序 ID 才能启用调用,但任何人都可以从我的网页中包含的 Javascript 代码中窃取 key 。

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

最佳答案

你无能为力。

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

然而,程序需要与服务器进行通信的所有信息都会被告知(由服务器以 token 形式提供,或由用户以凭证形式提供)。

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

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

您是否担心他们会“屏幕抓取”您的网站,并使用 wget 之类的工具快速下载它?然后,您可以放入一些服务器端规则来控制它们的访问(如果 IP x.y.z.w 在每个 BLEEM 时间内发出超过 Q 个请求,则丢弃请求/休眠 10 秒/非常缓慢地发送内容)。

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

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

关于security - 从非浏览器客户端保护 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21790561/

相关文章:

security - GAE 是否提供默认的定量滥用保护?

c# - 沙盒 AppDomain 中的 SecurityException

c++ - 在聊天应用程序中如何有效地在公共(public)房间发送消息

c# - NAT、wcf、双工通信……需要一些见识

mysql - 与使用完整的 MySQL 相比,使用独立的 SQL 文件是否有风险?

java - 在配置中保护纯文本密码

java - 将 Post 请求中的 String 参数和对象传递给 RESTful 服务

c# - WCF 休息满 "413 Request Entity Too Large"

java - 如何将 JSON 映射到 JAXB 对象?

c# - 处理来自 WS 的异常