【问题标题】:Publicly viewable UserId for the public profile公开个人资料的公开可见用户 ID
【发布时间】:2012-07-06 07:48:11
【问题描述】:

我想为我网站上的每个用户创建一个公开的个人资料页面。与 SO 用户配置文件非常相似的东西。但我不想公开我用作 PK 的 Guid。我也不知道用户名在网站的整个生命周期中在 url 中使用它的唯一性。

问题是 SO 本身是如何在 url https://stackoverflow.com/users/242506/nubm 中做到这一点的?可以删除用户名并且 url 仍然有效,但我是否应该在我的 Guid 旁边生成一些可公开查看的 UserId,我可以在指向个人资料页面的链接中使用并在 url 中显示它?

我发现了类似的问题 Should I expose a user ID to public?How do I create a "public" user profile page in ASP.NET (3.5),但它们并不是我想知道的。

【问题讨论】:

  • SO 只使用用户 ID - 也就是说,它们存储的是整数而不是 GUID。

标签: c# asp.net database asp.net-mvc-3 security


【解决方案1】:

你可以做两件事。

首先,您可以在数据库上创建一个额外的增量 ID,无论是在 ASP.NET 表上还是在新的映射表上,并提供一个连接到 Guid 的较小数字。为什么要小一些?因为 Guid 是 128 位,并且太大而无法在 url 上使用。

然后,您可以在 url 上使用这个与 Guid 相连的较小数字。这里唯一的漏洞利用问题是任何人都可以找到您的所有用户列表。所以有这个公开所以如果你也公开它们不是问题。所以使用他们的 URL 中的数字来查找用户,用户名是为了更好的 SEO。号码保持不变,但名称可以更改,因此仅使用号码来定位用户。

第二种解决方案是将 128 位 Guid 编号压缩和编码为 73 个基本字符串。我选择了 73 个基本字符,因为 73 是 url 上允许的非转义字符。

以下是我找到的一些用于进行此转换的示例:

http://www.singular.co.nz/blog/archive/2007/12/20/shortguid-a-shorter-and-url-friendly-guid-in-c-sharp.aspx

http://jopinblog.wordpress.com/2009/02/04/a-shorter-friendlier-guiduuid-in-net/

http://buildmaestro.wordpress.com/2011/04/27/installscript-to-transform-guid-into-compressed-guid/

一个简单的base64转换(来自Dave Transoms

public static string Encode(Guid guid)
{
  string encoded = Convert.ToBase64String(guid.ToByteArray());
  encoded = encoded
    .Replace("/", "_")
    .Replace("+", "-");
  return encoded.Substring(0, 22);
}

public static Guid Decode(string value)
{
  value = value
    .Replace("_", "/")
    .Replace("-", "+");
  byte[] buffer = Convert.FromBase64String(value + "==");
  return new Guid(buffer);
}

【讨论】:

    【解决方案2】:

    在 SO 的情况下,使用 PK。 url 的用户名部分是可选的,被忽略。

    【讨论】:

      猜你喜欢
      • 2013-02-21
      • 2014-03-03
      • 2018-03-26
      • 2011-02-25
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多