公共配置文件的公开可见UserId

时间:2012-05-14 12:37:19

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

我想为我网站上的每个用户创建公开个人资料页面。与SO用户配置文件非常相似的东西。但我不想暴露Guid我用作PK。我不知道在网站的生命周期内用户名是多么独特,以便在网址中使用它。

问题是SO本身如何在网址https://stackoverflow.com/users/242506/nubm中执行此操作?用户名可以删除,网址仍然有效,但是我应该在我的Guid旁边生成一些可公开查看的UserId,我可以在链接到个人资料页面使用它并在网址中显示它吗?

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

2 个答案:

答案 0 :(得分:2)

你可以做两件事。

首先,您可以在ASP.NET表或新映射表上为数据库创建额外的增量ID,并将较小的数字连接到Guid。为什么数量较小?因为Guid是128位并且太大而无法使用它在URL上。

然后,您可以在网址上使用与Guid相关联的较小数字。这里唯一的漏洞利用问题是任何人都可以找到所有用户列表。因此,如果您将它们公之于众,那么这也不是问题。因此,使用其URL中的数字来查找用户,并且用户名是为了更好的SEO。数字保持不变,但名称可以更改,因此只有数字用于定位用户。

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

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

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);
}

答案 1 :(得分:1)

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