【问题标题】:Visible User ID in Address Bar地址栏中的可见用户 ID
【发布时间】:2014-10-07 13:34:50
【问题描述】:

目前,为了在某些视图上将用户 ID 传递给服务器,我使用原始用户 ID。

http://example.com/page/12345 //12345 Being the users id

虽然通过暴露这些数据在我的特定应用程序中没有真正的安全风险,但我不禁对此感到有点肮脏。什么是正确的解决方案?我应该以某种方式伪装数据吗?

也许提出我的问题的更好方法是询问标准方法是什么。如果不是安全风险,应用程序在普通视图中使用用户 ID 是否很常见?如果是安全风险,如何处理?我只是在这里寻找正确方向的一点。

【问题讨论】:

  • 如果一个用户可以更改URL来查看另一个用户的页面,例如/page/12346,是否有问题?
  • 并非如此。这些页面是公开的。话虽这么说,我并不喜欢有人能够一个一个地增加数字,因为没有一个更好的词很烦人。我想以某种方式伪装 id,但不确定正确的方法。

标签: security url web


【解决方案1】:

这本身并没有错。很多网站都这样做。例如,可以使用以下形式的 URL 枚举 Stack Overflow 用户:

http://stackoverflow.com/users/123456

在 URL 中使用规范化的用户名形式,结合 ID 或作为它的替代,可能是一个更好的解决方案,例如:

http://example.com/user/yourusername

http://example.com/user/12345/yourusername

如果您使用前者,则需要确保将规范化的用户名设置为用户数据库中的唯一键。

如果您选择后者,您有一个选择:如果数据库中的规范化用户名与 URL 中的用户名不匹配,您可以重定向到正确的 URL(就像 Stack Overflow 一样),或者返回 404 错误。

【讨论】:

    【解决方案2】:

    除了duskwuff 建议使用用户名而不是ID 本身之外,您还可以使用UUIDs 而不是整数。它们的长度为 128 位,因此无法枚举,并且还避免透露您拥有多少用户。作为一个额外的好处,如果您的网站变得非常流行,那么它可以在未来不受用户 ID 限制的影响。

    例如,对于整数 id,攻击者可以在第一天找出最大的 user_id,然后在一周或几个月后返回并找出现在最大的 user_id。他们可以不断地这样做来监控您网站的增长速度——对于你的例子来说可能不是什么大问题——但许多组织认为这种信息在商业上是敏感的。还有助于避免社会工程,例如使攻击者更难通过电子邮件向您发送要求重置其密码的电子邮件,“因为我更改了电子邮件提供商并且忘记了旧密码,但我记得我的用户 ID!”。攻击一英寸,他们就会跑一英里。

    我更喜欢使用Version/Type 4 (Random) UUIDs,但是您也可以使用版本/类型 5(基于 SHA-1),因此您可以转到 UUID.fromName(12345) 并从整数值中获取 UUID,这很有用如果您想迁移现有数据并需要更新一堆外键值。大多数主要语言本身都支持 UUID,或者包含在流行的库(C 和 C++)中,尽管一些数据库软件可能需要一些调整 - 我已经将它们与 postgres 和我自己一起使用,并且很容易转换。

    缺点是 UUID 明显更长且不易记住,但听起来您不需要用户手动输入 URL 的能力。创建用户时您还需要check if the UUID already exists,如果需要,请继续生成,直到找到未使用的 UUID - 实际上,考虑到数字的大小,使用第 4 版随机 UUID,您将有更好的获胜机会彩票而不是处理碰撞,所以它不会影响性能等。

    示例网址:http://example.com/page/4586A0F1-2BAD-445F-BFC6-D5667B5A93A9

    【讨论】:

      猜你喜欢
      • 2015-05-18
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2021-10-28
      • 2022-12-01
      • 1970-01-01
      相关资源
      最近更新 更多