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

kal*_*mar 11 javascript rest android jersey java-ee

这是挑战:

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

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

在我看来,唯一的解决方案是"默默无闻".

思路:

  • 从服务器加载随机JS功能(让我们称之为"挑战"),在浏览器(或应用程序)中执行,以特定方式指纹浏览器(浏览器缺陷?),计算结果并发送结果返回每个REST-API调用.

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

提前谢谢你,抱歉我的英语不好

编辑:

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

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

tas*_*wyn 11

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

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

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

如果你只是为了"足够好",那么你可能有一些选择来帮助降低看到这种情况发生的可能性,例如像你提出的通过默默无闻解决方案的安全性,但你永远不应该依赖它,即使这样.

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

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


Chr*_*e L 5

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

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

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

您可以为此使用自己开发的库或更标准的库,例如OAuth2