REST - 如何限制未授权客户端软件的访问

时间:2012-12-27 17:22:48

标签: javascript android rest java-ee jersey

这是挑战:

服务/业务层具有REST(JSON)接口。 有两种可以调用API的客户端:webapp,它在浏览器和移动应用程序(Android)中运行。他们都是公开的。使用授权(!)webapp或授权(!)移动应用程序的每个人都应该有权访问这些资源。应禁止所有未经授权的客户端(例如脚本)。

注意:有多少用户或哪些用户可以访问服务层没有限制 - >客户端公钥证书可能无法使用。只有客户端软件才能获得授权。

在我看来,唯一的解决方案是“默默无闻”。

思路:

  • 从服务器加载随机JS功能(让我们称之为“挑战”),在浏览器(或应用程序)中执行,以特定方式指纹浏览器(浏览器漏洞?),计算结果和每次REST-API调用都会返回结果。

您还有其他想法或建议吗?

提前谢谢你&抱歉我的英文不好

编辑:

我的问题与用户身份验证和/或授权无关,但客户端软件身份验证+授权。

我的问题的背景是,我自己的应用程序(android + web)有一个RESTful后端,我不希望有人在它上面创建自己的客户端软件。之所以这样,是因为它是一个商业网站/应用程序,提供了一些收集费用非常高的数据。我想推广网站和移动应用,而不是RESTapi(或某些第三方竞争对手)。

2 个答案:

答案 0 :(得分:11)

不幸的是,我的回答是你应该完全不相信客户端应用程序。

虽然有多种方法可以与您分发的客户端建立信任关系,但所有这些方法都可能被黑客攻击,破解或绕过。永远不要相信来自服务器外部的任何数据。永远。永远不要依赖于来自客户端或主要Web浏览器的连接。一切都可以用足够的时间和精力进行欺骗。

像游戏这样的事情可以很容易地看到一些像这样的行业问题很好的例子,即使是检查内存黑客和其他方法的例程,最终即使像魔兽世界这样的巨额预算的服务也常常看到他们的黑客客户端显示或完全客户端模拟器能够发送普通客户端不会发送的命令。依靠您的客户端软件保持安全,只有将适当的数据发送到您的服务器才是灾难。如果是重要的事情,请始终验证服务器端。始终正确地转义/参数化数据。使用白名单模型,并且最好在适当的情况下使用基于用户输入的符号表查找而不是用户数据本身。等等。客户端验证应该只被视为帮助用户,而不是安全的东西。

如果您只是为了“足够好”,那么您可能有一些选项来帮助减少发生这种情况的可能性,例如您提出的通过默默无闻解决方案的安全性,但您应该永远依赖就不会发生,即便如此。

一种解决方案是基本上不包括客户端内客户端的主要功能,而是在运行时从服务器(javascript / etc)发送它,每次将逻辑包发送到客户端时都使用不同的指纹,可能有一系列不同的逻辑程序,随机选择一个。然后,您可以超时打包,跟踪哪个用户访问了哪个包,并让包返回telemetrics,您还可以使用它来帮助维护安全性。返回的逻辑与使用指纹发送的内容之间的任何不匹配都可以立即被假定为欺骗或黑客尝试。但是,最终所有这些仍然可以被打败(像这样的相对简陋的例子可以被确定的人轻易打败,特别是如果你没有运行时内存安全性的话。)

有许多方法可以处理中间人(MITM)攻击,有人试图拦截数据,但没有一种方法可以完全解释受损端点。

答案 1 :(得分:4)

Web服务器通常支持“会话”的概念。当Web浏览器连接时,会在服务器上创建一个返回session ID (as a HTTP cookie usually)的会话。然后,Web浏览器将该会话ID cookie发送给服务器的所有后续请求。

使用这种机制,许多编程语言/框架都有一个身份验证/授权模块,允许用户对自己进行身份验证(通常使用用户名和密码)。一旦验证了用户的身份,就会使用用户的ID更新会话。然后,服务器代码会检查会话中的每个请求的用户ID,以确保用户经过身份验证/允许发出请求(无论是HTML页面视图还是API GET / POST)。

Android(或iOS ...)应用程序的情况可能略有不同,但想法类似:让用户自己验证一次,给客户端一个“秘密令牌”,它与服务器一起映射到服务器中用户记录。然后,为客户端发送的所有请求传递此令牌。

您可以使用本土图书馆或更为标准的图书馆,例如OAuth2