对于多租户数据库,将租户 ID 作为 GET 参数传递给 API 是否安全?
For a Multi-Tenant database, is it safe to pass Tenant ID's as GET parameters to the API?
给定一个多租户数据库,如果我要使用任何流行的基于 JS 的 UI 平台(即:Angular、Vue 等)创建一个网站,并假设两者该站点和 API 使用 HTTPS,将租户 ID 作为 QS 参数传递给 API 是否安全?
为了解释更多,假设我们在数据库中有一个名为 Customer
的 table,它有一个名为 CustomerId
的主键列,它是一个自动递增的整数。将有一些 API 端点(嗯,实际上是大多数)需要 CustomerId
作为参数。
我不确定(对于基于 JS 的 UI 平台仍然是新手)是我是否需要担心这个 CustomerId
很容易被欺骗。例如:
"If MY customer ID is 32891, then let's see what happens if I make the same API call using 32892 instead!"
如果站点和 API 都是 HTTPS,这是否值得关注?或者,我是否也应该给每个客户一个 GUID,然后在 API 参数中使用它?
(明确地说,我不是在询问浏览器地址栏中清晰可见的查询字符串参数。我是在询问对 API 的 GET 调用,其中这些 ID 作为查询字符串参数。此外... API 本身使用 JWT 进行保护,以防止未经授权的调用。这并不重要,但 API 是在 .NET 5.0 中使用 C# 构建的)
我建议将 customerId 作为 JWT 负载的一部分(搜索 jwt 声明以及如何在生成令牌时添加自定义声明)。
这样你就可以确保它没有被恶意用户修改。
如果需要,您仍然可以将其作为查询参数传递,但您可以选择通过将查询值与 JWT 中的值进行比较来进行验证。
不要相信用户。如果他们可以更改他们的 customerId 并操纵请求,那就是一个安全问题。
另一种选择是根本不传递 customerId,而是在授权用户执行数据库调用并查看他的 customerId 之后。我个人更喜欢第一个选项,因为您不必进行额外的数据库调用。
给定一个多租户数据库,如果我要使用任何流行的基于 JS 的 UI 平台(即:Angular、Vue 等)创建一个网站,并假设两者该站点和 API 使用 HTTPS,将租户 ID 作为 QS 参数传递给 API 是否安全?
为了解释更多,假设我们在数据库中有一个名为 Customer
的 table,它有一个名为 CustomerId
的主键列,它是一个自动递增的整数。将有一些 API 端点(嗯,实际上是大多数)需要 CustomerId
作为参数。
我不确定(对于基于 JS 的 UI 平台仍然是新手)是我是否需要担心这个 CustomerId
很容易被欺骗。例如:
"If MY customer ID is 32891, then let's see what happens if I make the same API call using 32892 instead!"
如果站点和 API 都是 HTTPS,这是否值得关注?或者,我是否也应该给每个客户一个 GUID,然后在 API 参数中使用它?
(明确地说,我不是在询问浏览器地址栏中清晰可见的查询字符串参数。我是在询问对 API 的 GET 调用,其中这些 ID 作为查询字符串参数。此外... API 本身使用 JWT 进行保护,以防止未经授权的调用。这并不重要,但 API 是在 .NET 5.0 中使用 C# 构建的)
我建议将 customerId 作为 JWT 负载的一部分(搜索 jwt 声明以及如何在生成令牌时添加自定义声明)。 这样你就可以确保它没有被恶意用户修改。
如果需要,您仍然可以将其作为查询参数传递,但您可以选择通过将查询值与 JWT 中的值进行比较来进行验证。
不要相信用户。如果他们可以更改他们的 customerId 并操纵请求,那就是一个安全问题。
另一种选择是根本不传递 customerId,而是在授权用户执行数据库调用并查看他的 customerId 之后。我个人更喜欢第一个选项,因为您不必进行额外的数据库调用。