有没有办法确保请求来自受信任的UI应用程序



因此,为了给您一个背景,我们有一个后端应用程序,它有大量的API(Spring引导框架(。然后是一个混合了React和Ember.js的UI应用程序。我们使用的是OAuth2.0访问令牌。

UI的每个页面可以使用多个API资源,并且页面的权限(包括动作和按钮(与直接访问API的权限分开管理。

现在的问题是,为了阻止任何拥有访问令牌的人可以直接调用任何API。为了阻止这种情况,我们决定将每个页面或按钮中使用的服务/资源链接到路由url(Ember.js路由(,以便根据用户对这些路由的权限,我们确定他们是否可以访问后端的特定服务。换句话说,如果用户直接向服务发送请求,并表示该服务链接到了他在UI世界中无法访问的页面,则安全检查会阻止他。

然而,这正成为一个令人头疼的问题。页面不断变化,一些服务被删除或添加新服务,我们必须不断维护SQL脚本以保持两者之间的链接。现在要提到的是,由于UI(路由(的层次结构,这变得更加复杂。

现在我想知道,如果我们可以确定请求来自UI,那么我们不需要检查对API的权限,并且如果他们没有访问权限,UI将不会被呈现,我们可以安全地让请求进入并提供服务。如果同一用户使用他的UI令牌直接访问API,我们只需阻止它。如果用户需要直接访问API,那么他们必须获得API使用的特殊令牌(有些用户可能需要直接使用API(。

现在的问题是,我们如何确定请求来自UI,并且该UI页面是我们信任的页面?我在互联网上搜索了一下,但没有找到任何框架或协议。这可能吗?

如果我完全错过了,很抱歉,但这不只是跨来源资源共享(CORS(的一个简单案例吗?

您可以将每个控制器上允许的CORS设置为UI/前端域的CORS。

@CrossOrigin(value = "example.com")
@RestController
public class PrivateController {
}

控制器现在将拒绝任何不来自example.com的内容。

我们如何确定请求来自UI,并且UI页面是我们信任的页面?

你可能做不到。要做到这一点,你需要一个可信的执行环境,换句话说,一个用户不能完全控制的环境。例如,信用卡销售点机器、有线/卫星电视盒和ARM TrustZone。这些环境允许您在客户端设备上存储用户不可见的机密。然后,您可以使用这个秘密在可信环境中与您的代码通信,而无需用户访问它

但是,用户的web浏览器不是一个可信任的执行环境。用户可以在你的网页上看到所有的cookie、本地和会话存储等,他们可以使用它们直接通过curl之类的东西发出请求,这样请求看起来与浏览器中的请求相同。

不在问题中,但你该怎么办
考虑到您现在的设置方式,这听起来可能很痛苦,但请在API上进行所有安全和许可。如果您不希望用户使用他们的令牌以自动方式大量调用API,那么对令牌实施速率限制
重新审视当初设置此设置的原因可能也很有用。用户调用API是否直接使服务器过载?这只是用户体验对用户在页面上看到的内容的关注吗?是否关注用户可以访问哪些数据和操作?

最新更新