假设一个ASP.NET MVC应用程序有一个保护会员区。 产生的一些网址包含敏感数据,例如帐户/ 123,123是敏感数据如帐户号。 如果用户机器后得到了妥协,攻击者无法获取到帐户/ 123,因为这将受到保护,但我们已经获得了用户只要看一眼他们的浏览器历史记录帐号。 我可以看到避免这个问题的唯一办法就是不要在URL中,即使在保护区使用的敏感数据。
我在想scenerios其中的敏感数据是用于索引,详细信息的ID,编辑..一个解决办法是添加另一个字段表示敏感数据的表格,如果受到损害,但可以在URL中使用这就是意味着什么。
或者有另一种方式?
我想说的URL不使用敏感数据,并保持存储在用户会话中的帐号(如果假设多个账号,只保留当前的)。
编辑
看到您的编辑后:
如果你真的想不通过页面的URL有任何想法的客户端安全的方法来此取这种情况下考虑。
- 用户有多个帐户
- 帐户列在页面上
- 帐户“ID”被使用当前的会话ID加密
- 用户点击链接,并把他带链接/帐号/ 10912ljlkj2308s
现在,您的帐户ID是不再可见,并且加密密钥是只对会话和ID良好。 诚然会话ID的不一定是唯一的,但是这将是在历史/缓存中的“观众”一个巨大的威慑力。
不要使用HTTP GET的请求敏感数据。 使用HTTP POST来代替。 把[AcceptVerbs(HttpVerbs.Post)]
在你的ActionResult是肯定的。
类似的说明,不要使用HTTP GET来获得,你会在AJAX请求中使用的数据,有一个微妙的JSON漏洞 。
我有一个类似的问题...还在想着最好的解决办法......但已经实现了汤姆的解决方案。 A面的问题是URL必须是MVC的“友好”。 的HTMLEncode不起作用,因为它允许/的。 Base64编码适用于以下辅助方法:
public static string Base64ToUrlFriendlyBase64(string value)
{
return value.Replace("/", "_").Replace("+", "-");
}
public static string UrlFriendlyBase64ToBase64(string value)
{
return value.Replace("_", "/").Replace("-", "+");
}