代码之家  ›  专栏  ›  技术社区  ›  Tyst

在ASP.NET中实现安全、唯一的“一次性”激活URL。NET(C#)

  •  25
  • Tyst  · 技术社区  · 16 年前

    我有一个场景,在这个场景中,我正在构建的网站的用户需要能够在不登录的情况下将一些基本信息输入到Web表单中。该网站正在用ASP。NET/C#,并使用MSSQL 2005作为其关系数据。

    我的问题是关于这个问题的安全实现。我曾考虑使用GUID作为唯一标识符,但不确定它在安全领域的意义。

    1. GUID是否足够长,以至于值不容易被猜测(或随着时间的推移被强行破解)?
    2. 如果使用GUID是一种可接受的方法,那么网站是否应该通过URL重写或将数据表中的信息与GUID作为引用相关联来重定向到信息?

    3. 使用URL重写会隐藏数据的真实来源吗?

    4. 我处理这个问题的方法完全错了吗?

    非常感谢,

    卡尔

    6 回复  |  直到 16 年前
        1
  •  15
  •   Urasquirrel    8 年前
    1. 不,GUID不是完全随机的,大多数比特要么是静态的,要么很容易猜测。
    2. 不是,见1和2。
    3. 你可以,但不需要……看看我最后的解决方案。
    4. 对。

    您应该使用的不是GUID,而是一个密码强大的随机数生成器-使用 System.Security.Cryptography.RNGCryptoServiceProvider base64 encode 那。
    此外,假设这是一种使用敏感数据的注册,你会希望限制链接的有效期,比如60分钟或24小时,具体取决于你的网站。

    当然,不要忘记这个URL应该是HTTPS。..

    哦,差点忘了——你应该考虑的另一个问题是,如果用户想要向他发送几封电子邮件,比如点击注册几次,会发生什么。他能一遍又一遍地这样做,并得到许多有效的网址吗?只有最后一个有效吗?或者,同样的价值观会一次又一次地被怨恨?当然,如果匿名用户可以提交对此电子邮件的请求,那么DoS可能会成为一个问题。..更不用说,如果他输入自己的电子邮件,他也可以输入任何随机地址,淹没一些可怜的混蛋的收件箱,并可能导致你的邮件服务器被列入黑名单。..
    没有一个正确的答案,但需要在您的申请中加以考虑。

        2
  •  10
  •   Mehrdad Afshari    15 年前
    1. 128 足够长了。
    2. 否,GUID实现旨在生成 GUID而不是随机的。你应该使用 cryptographically secure RNGCryptoServiceProvider Guid 结构与此。
    3. 是的,总体而言,这是一种可以接受的方法。两者都会奏效。
    4. 是的,如果你不提供任何其他线索
    5. goto 2
        3
  •  4
  •   JP Alioto    16 年前

    我建议只使用普通随机数,例如 RNGCryptoServiceProvider.GetBytes GUID并不意味着是完全随机的。它们有固定的位,有些版本使用你的MAC地址。GetBytes还为您提供了使用超过128位的选项(尽管这应该足够了)。

    我认为最好不要把用户的数据放在url中。虽然HTTPS可以在传输过程中保护它,但它可能仍然存在于用户的浏览器历史记录中。最好使用POST并将随机数与数据库的一行相关联。

        4
  •  4
  •   Matthew Flaschen    16 年前

    这可能有点过头了,但你可以用哈希来散列他们的电子邮件地址 SHA1 使用你的guid(NewGuid很好)作为 hash salt 然后,当他们到达你的页面时,你可以问他们的电子邮件地址,检索guid并重新计算哈希值进行验证。即使有人知道要尝试哪些电子邮件地址,如果不知道你使用的guid,他们也永远无法生成哈希冲突(否则会花很长时间:)。当然,您必须将他们的电子邮件和哈希盐guid保存在数据库中。

        5
  •  1
  •   peterchen    16 年前

    首先,如果可能的话,您应该通过限制查询的吞吐量来限制暴力破解(例如,每秒每IP的有限尝试次数和每秒的有限总尝试次数)。

    如果安全是首要任务,我会选择 cryptographically strong random number generator

        6
  •  -1
  •   Spegah    10 年前