如何在应用程序中的客户端之间创建隔离

How to create isolations between clients in an app

您好,我正在学习 Blazor,并且正在创建一个后端和前端应用程序(Blazor Web 程序集) 它运行良好,但我的问题与安全性有关。

我有用户、企业客户和发票。这是一个非常简单的应用程序 用户 ID 是一个 GUID,其他(商业客户和发票)是整数和顺序(递增 1,如 1,2, 3 和...)

每个用户都不能看到其他用户的数据,也不能访问它们 此应用有 2 个部分,一个 API 后端和一个 Blazor 前端。

让我们添加一些数据,例如:

最终用户也可以只使用 API 而无需使用前端

我在发票库中有:

Task<Invoice> GetInvoicesListAsync(int businessId);

验证后用户可以访问其发票列表

如果我们有一个经过验证的最终用户,如“Alex”(在用户 table 的第二行),可以检索不属于他的数据 因为 BusinessId 是连续的,当他知道他的业务 Id 是 99 时,他可以检索业务 100,101,102 的发票和......只需一些尝试 喜欢 :

var lst = await GetInvoicesListAsync(101);

我的问题是:

1- 我们如何才能阻止它?我是否需要强制最终用户在 API 参数中输入 UserId 以及安全性,如下所示:

Task<Invoice> GetInvoicesListAsync(Guid userId, int businessId);

2- 如果我添加 userId 是否会对性能产生影响?因为在这种情况下,我也需要与用户 table 进行内部连接,如果我们有复杂的数据库,那么它会对性能产生很大影响

3- 你有什么建议

谢谢

作为要点列表的答案:

  1. 不,你不知道。从安全的角度来看,GetInvoicesListAsync(int businessId) 方法已经足够好了。您需要提取每个用户的业务列表并检查请求的业务是否在列表中,或者更简单地添加一个 where / join 条件来过滤用户业务的发票。

  2. 如果您有正确的索引,内部连接不是问题。使用您的数据库 explain 查询计划来验证您的查询是否正在使用索引并且不执行任何完整的 table 扫描

  3. 当您的用户调用 API 时,您需要验证用户(有效的令牌或 cookie)并获取相关业务的列表,因此您不需要接收此信息来自 API 参数。从安全的角度来看,这是最大的问题。安全 API 的规则是“嘿 API,我叫什么名字?”