URL中的敏感数据的ASP.NET MVC保护成员区域

问题描述:

假设ASP.NET MVC应用程序具有受保护的成员区域。生成的一些URL包含敏感数据,例如Accounts/123,123是敏感数据,例如帐号。如果用户机器后来受到攻击,攻击者无法访问Accounts/123,因为这会受到保护,但他们只是通过查看其浏览器历史记录来获得用户帐号。我能看到的避免这种情况的唯一方法就是不使用URL中的敏感数据,即使在受保护的区域也是如此。URL中的敏感数据的ASP.NET MVC保护成员区域

我在考虑scenerios,其中敏感数据是用于索引,细节,编辑的ID。解决方案可能是向表中添加另一个表示敏感数据的字段,这意味着如果受到威胁,在URL中使用。

或者还有另外一种方法吗?

我会说不使用URL中的敏感数据,并保持帐号存储在用户会话(如果假设多个帐号,只保留当前)。

编辑


看到您的编辑后:

如果你真的想要,而不必通过页面的URL任何想法采取此方案考虑到客户机的安全方法来此。

  • 用户具有
  • 帐户在页面上列出了多个帐户
  • “ID”使用当前会话ID加密的账户
  • 链接的用户点击,并带他到链接/帐户/ 10912ljlkj2308s

现在您的帐户ID不再可见,并且加密密钥仅适用于该会话和该ID。授予的会话ID可能并不总是唯一的,但这对于历史/缓存中的“查看者”是一个巨大的威慑。

+0

我更新了我的问题,使之更清楚一点 – Danny 2009-08-15 17:32:55

+0

你会如何加密,解密的ID? – Danny 2009-08-16 18:29:48

+0

任何加密都会真正起作用 – 2009-08-17 15:37:44

不要使用HTTP GET来请求敏感数据。改用HTTP POST。把你的ActionResult上的[AcceptVerbs(HttpVerbs.Post)]确定下来。

在类似的说明中,请不要使用HTTP GET来获取您将用于AJAX请求的数据,这里有subtle JSON vulnerability

+0

我更新了我的问题,使其更清晰 – Danny 2009-08-15 17:33:30

我有一个类似的问题...仍然想着最好的解决方案......但实施了汤姆的解决方案。一个侧面的问题是该网址必须对mvc“友好”。 HtmlEncode不起作用,因为它允许/。 Base64编码适用于以下辅助方法:

public static string Base64ToUrlFriendlyBase64(string value) 
{ 
    return value.Replace("/", "_").Replace("+", "-"); 
} 

public static string UrlFriendlyBase64ToBase64(string value) 
{ 
    return value.Replace("_", "/").Replace("-", "+"); 
}