【问题标题】:Security when exposing user information暴露用户信息时的安全性
【发布时间】:2012-03-08 05:16:50
【问题描述】:
我目前正在使用 ASP .Net MVC3 构建电子商务网站。在结帐过程结束时,我有一个视图,其中显示了订单摘要,包括客户的联系方式(姓名、电子邮件、地址、联系号码等)。
我在查询字符串中使用了 GUID,用于从数据库中检索信息并将其显示在页面上(例如,www.site.com/Checkout/Complete?ID={GUID})。就安全性而言,这是否被认为是不好的做法?有人需要猜测 GUID 才能访问任何客户信息,这似乎几乎是不可能的。在显示信息之前,我是否应该额外努力对用户进行身份验证?
非常感谢
【问题讨论】:
标签:
asp.net-mvc-3
security
authentication
【解决方案1】:
GUID 本身非常难以猜测或暴力破解。有 125 个可能的 GUID 的 2 次方(不是 2^128,因为有些位有 fixed meaning)。
更大的担忧是
- 许多浏览器会将浏览器历史记录(参见 here 或 here 或 here)暴露给不相关的页面。
- 如果用户将结帐页面添加为书签,则可以从书签中检索到他的特殊 GUID。
- Man-in-the-middle 攻击(尽管此时您可能正在使用 SSL,所以问题不大)。
如果目的是允许某人链接回他们之前下的订单,为了方便起见,我会允许 GUID 预填充用户名,但仍需要密码。
如果在浏览会话期间发生这种情况并且由于某种原因您需要 GUID(您不能将该信息存储在用户会话中吗?),我倾向于为此创建一个一次性 GUID,而不是暴露用户的唯一 ID。将一次性 GUID 映射到服务器代码中用户的实际唯一 ID(可以是真实 GUID 的加盐哈希,也可以映射到映射表中)。
【解决方案2】:
用户应该经过身份验证,您的代码应该检查当前登录的用户是否可以访问该信息。