向用户公开UserId是否安全?

时间:2019-07-06 12:49:16

标签: asp.net security asp.net-core asp.net-identity

我正在开发一个Web应用程序,我想知道将UserId暴露给客户端是否可能构成安全漏洞。 (通过UserId,我指的是由Identity Framework创建的Identity用户对象的Id,并用作users表的PK。)

提供一些背景信息或示例:在我的应用程序中,我需要区分登录用户发布的内容和其他用户发布的内容。在幼稚的方法中,我只是将内容的UserId与当前已认证用户的UserId进行比较。但这意味着客户端可以看到所有相关用户的ID。

我的直觉告诉我这不是一个好主意,但我无法查明原因。因此,我想知道是否存在有关此问题的指南。也许将知识面减少到最低限度只是一般规则。

如果是这种情况,我应该如何进行? UserId的哈希值是否有助于解决该问题,还是周围有更好的方法?

编辑

我所举的例子不是最好的,因为可以通过在后端比较用户ID,然后将内容发送到已经标记为“我的”或“被他人”的客户端来轻松解决此问题。但是,仍然存在普遍的问题。

3 个答案:

答案 0 :(得分:2)

例如,如果用户ID本身是敏感数据,则由于某种原因您的主键碰巧是社会安全号码,那肯定是安全和隐私责任。如果您的用户ID只是自动递增的数字,那应该没问题。

始终最好在系统外部公开唯一标识符,而不是主键。它为您提供了更大的灵活性,可以解决数据混乱,处理数据迁移问题以及将来对系统进行过时验证的情况。

如果UID只是用户的标识符。知道用户的UID并不会授予您与该用户相关联的任何权限。在URL中共享UID与在Github上共享用户名或在Stack Overflow上共享唯一ID一样安全。

Stack Overflow在其URL中显示用户ID,以使用户配置文件查找有效:https://stackoverflow.com/users/10158551/xing-zou

无论如何,这取决于您的设计,并且您需要比我们更多的考虑。

请参阅Should I expose a user ID to public?

答案 1 :(得分:0)

在客户端公开用户ID通常不是一个好主意。如果您需要任何信息,则用户名或唯一编号要比数据库中的确切用户ID好。如果您的应用程序具有针对SQL注入攻击的防护功能,那么通常这不是问题。但是,如果在漏洞中存在任何漏洞,那么如果有人知道某个用户的用户ID,他们可以为该用户注入SQL脚本。 一个更好的主意是向其中包含声明的客户颁发访问令牌。访问令牌将在服务器端为您执行身份验证。

答案 2 :(得分:0)

我将其归为低风险类别。正确识别后,公开用户ID确实会增加风险。

对于您的应用程序来说,听起来您需要帖子的标识符,并指示该帖子是由用户还是由其他人发表。

您可以通过以下方式来构造该结构以避免低风险敞口:

GET /posts

{
  "postId": "AJDIWC",
  "isAuthor": true,
  "content": "This is a post by the user."
},
{
  "postId": "LISHWE",
  "isAuthor": false,
  "content": "This is a post by another user."
}

编辑

要在编辑后回答您的问题,是的,最佳做法是避免在授权边界允许的情况下避免向其他用户公开标识符。

例如,让受RBAC保护的应用程序的管理员用户看到其安全范围内的用户的唯一标识符是没有问题的。