假设ASP.NET MVc应用程序具有受保护的成员区域。生成的某些URL包含敏感数据,例如Accounts / 123,123是敏感数据,例如帐号。如果用户机器后来遭到入侵,则攻击者无法访问Accounts / 123,因为这会受到保护,但我们只是通过查看他们的浏览器历史记录获得了用户帐号。我可以看到避免这种情况的唯一方法是即使在受保护的区域也不要在URL中使用敏感数据。
我在考虑一下场景,其中敏感数据是用于索引,细节和编辑的ID。解决方案可能是在表中添加另一个表示敏感数据的字段,这意味着如果被破坏但没有任何意义但可以使用在URL中。
还是有另一种方式吗?
答案 0 :(得分:7)
我想说不要在URL中使用敏感数据,并将帐号保存在用户会话中(假设有多个帐号,只保留当前帐号)。
修改强>
看到你的编辑后:
如果你真的想要一个安全的方法来解决这个问题而没有客户通过网页的网址有任何想法,请考虑这个场景。
现在您的帐户ID不再可见,加密密钥仅适用于该会话和该ID。授予的会话ID可能并不总是唯一的,但这对历史/缓存中的“查看者”来说是一个巨大的威慑。
答案 1 :(得分:0)
请勿使用HTTP GET来请求敏感数据。请改用HTTP POST。将[AcceptVerbs(HttpVerbs.Post)]
放在ActionResult上以确定。
在类似的说明中,不要使用HTTP GET来获取您将在AJAX请求中使用的数据,而是subtle JSON vulnerability。
答案 2 :(得分:0)
我遇到了类似的问题......仍然在考虑最佳解决方案......但是已经实施了Tom的解决方案。另一个问题是网址必须对mvc“友好”。 HtmlEncode不起作用,因为它允许/。 Base64使用以下帮助程序方法:
public static string Base64ToUrlFriendlyBase64(string value)
{
return value.Replace("/", "_").Replace("+", "-");
}
public static string UrlFriendlyBase64ToBase64(string value)
{
return value.Replace("_", "/").Replace("-", "+");
}