将 UserId 公开给客户端是否安全?
Is it safe to expose the UserId to a client?
我正在开发 Web 应用程序,我想知道向客户端公开 UserId
是否可能构成安全漏洞。 (UserId
我指的是身份框架创建并用作用户 table 的 PK 的身份用户对象的 Id
。)
举一些上下文或例子:在我的应用程序中,我需要区分登录用户发布的内容和其他人发布的内容。在一种天真的方法中,我只是将内容的 UserId
与当前经过身份验证的用户的 UserId
进行比较。但这意味着客户端会看到所有相关用户的 ID。
我的直觉告诉我这不是一个好主意,但我无法查明原因。所以,我想知道是否有关于这个问题的指南。也许这只是将知识面减少到最低限度的一般规则。
如果是这种情况,我应该如何进行? UserId
的散列是否有助于解决问题或是否有更好的方法?
编辑
我做的例子不是最好的,因为这个问题可以很容易地在后端通过比较那里的用户 ID 然后将内容发送到已经标记为 "mine" 或 [=31 的客户端来解决=].但是,一般问题仍然存在。
在 client-side 公开用户 ID 通常不是一个好主意。如果您需要任何信息,用户名或唯一编号比数据库中的确切用户 ID 更好。如果您的应用程序具有针对 SQL 注入攻击的保护,这通常不是问题。但是万一存在漏洞,如果有人知道某个用户的用户ID,他们就可以为该用户注入SQL脚本。
一个更好的主意是向您的客户发出一个访问令牌,其中包含声明。访问令牌将在 server-side 上为您执行身份验证。
我会把它放在低风险类别中。正如您正确识别的那样,公开用户 ID 确实会增加风险面。
对于您的应用程序,听起来您需要 post 的标识符并指示 post 是由用户还是其他人创建的。
您可以按以下方式构建它以避免低风险暴露:
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 保护的应用程序的管理员用户查看用户在其安全边界内的唯一标识符是没有问题的。
如果用户 ID 本身就是敏感数据,例如,出于某种原因您的主键恰好是社会安全号码,那肯定会成为安全和隐私责任。如果您的用户 ID 只是 auto-increment 数字,应该没问题。
最好始终在系统外部公开除主键之外的唯一标识符。它让您更灵活地解析数据 mix-ups、处理数据迁移问题,以及 future-proofing 您的系统。
如果 UID 只是用户的标识符。知道用户的 UID 不会授予您与该用户关联的任何权限。在 URL 中共享 UID 与在 Github 上共享您的用户名或在 Stack Overflow 上共享您的唯一 ID 一样安全。
Stack Overflow 在他们的 URL 中显示用户 ID,以便进行用户个人资料查找:https://whosebug.com/users/10158551/xing-zou
总之,看你的设计,你比我们考虑的多。
参考Should I expose a user ID to public?
我正在开发 Web 应用程序,我想知道向客户端公开 UserId
是否可能构成安全漏洞。 (UserId
我指的是身份框架创建并用作用户 table 的 PK 的身份用户对象的 Id
。)
举一些上下文或例子:在我的应用程序中,我需要区分登录用户发布的内容和其他人发布的内容。在一种天真的方法中,我只是将内容的 UserId
与当前经过身份验证的用户的 UserId
进行比较。但这意味着客户端会看到所有相关用户的 ID。
我的直觉告诉我这不是一个好主意,但我无法查明原因。所以,我想知道是否有关于这个问题的指南。也许这只是将知识面减少到最低限度的一般规则。
如果是这种情况,我应该如何进行? UserId
的散列是否有助于解决问题或是否有更好的方法?
编辑
我做的例子不是最好的,因为这个问题可以很容易地在后端通过比较那里的用户 ID 然后将内容发送到已经标记为 "mine" 或 [=31 的客户端来解决=].但是,一般问题仍然存在。
在 client-side 公开用户 ID 通常不是一个好主意。如果您需要任何信息,用户名或唯一编号比数据库中的确切用户 ID 更好。如果您的应用程序具有针对 SQL 注入攻击的保护,这通常不是问题。但是万一存在漏洞,如果有人知道某个用户的用户ID,他们就可以为该用户注入SQL脚本。 一个更好的主意是向您的客户发出一个访问令牌,其中包含声明。访问令牌将在 server-side 上为您执行身份验证。
我会把它放在低风险类别中。正如您正确识别的那样,公开用户 ID 确实会增加风险面。
对于您的应用程序,听起来您需要 post 的标识符并指示 post 是由用户还是其他人创建的。
您可以按以下方式构建它以避免低风险暴露:
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 保护的应用程序的管理员用户查看用户在其安全边界内的唯一标识符是没有问题的。
如果用户 ID 本身就是敏感数据,例如,出于某种原因您的主键恰好是社会安全号码,那肯定会成为安全和隐私责任。如果您的用户 ID 只是 auto-increment 数字,应该没问题。
最好始终在系统外部公开除主键之外的唯一标识符。它让您更灵活地解析数据 mix-ups、处理数据迁移问题,以及 future-proofing 您的系统。
如果 UID 只是用户的标识符。知道用户的 UID 不会授予您与该用户关联的任何权限。在 URL 中共享 UID 与在 Github 上共享您的用户名或在 Stack Overflow 上共享您的唯一 ID 一样安全。
Stack Overflow 在他们的 URL 中显示用户 ID,以便进行用户个人资料查找:https://whosebug.com/users/10158551/xing-zou
总之,看你的设计,你比我们考虑的多。
参考Should I expose a user ID to public?