Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 表单身份验证是否可以防止会话劫持?_Asp.net_Security_Forms Authentication - Fatal编程技术网

Asp.net 表单身份验证是否可以防止会话劫持?

Asp.net 表单身份验证是否可以防止会话劫持?,asp.net,security,forms-authentication,Asp.net,Security,Forms Authentication,我有一个使用表单身份验证的ASP.NET MVC应用程序。用户经过身份验证后,作为响应,他将收到包含身份验证信息的表单cookie。现在,关于表单cookie:它由机器密钥加密,并通过签名防止篡改。我也使用HTTPS。。。但是,如果我以某种方式获得cookie并尝试从另一个客户端发出请求(意味着该请求将从另一个IP地址发出),该怎么办 在我看来,这一方案会奏效。有什么方法可以抵御这种攻击吗 有什么方法可以抵御这种攻击吗 你不应该。多年前,我们已经实现了这样的功能,并很快放弃了它。事实证明: 单

我有一个使用表单身份验证的ASP.NET MVC应用程序。用户经过身份验证后,作为响应,他将收到包含身份验证信息的表单cookie。现在,关于表单cookie:它由机器密钥加密,并通过签名防止篡改。我也使用HTTPS。。。但是,如果我以某种方式获得cookie并尝试从另一个客户端发出请求(意味着该请求将从另一个IP地址发出),该怎么办

在我看来,这一方案会奏效。有什么方法可以抵御这种攻击吗

有什么方法可以抵御这种攻击吗

你不应该。多年前,我们已经实现了这样的功能,并很快放弃了它。事实证明:

  • 单个用户从同一个浏览器/机器发出请求,但有时可以从不同的IP地址看到http/https之间的切换
  • 当手机在基站之间切换时,一个正在旅行和使用手机的用户有时会从不同的IP地址发出连续请求

为了澄清术语,会话劫持通常指未经授权的用户访问服务器上会话状态的漏洞

身份验证Cookie与会话Cookie不同。ASP.NET在保护身份验证cookie方面采取了更多的预防措施。您所描述的内容最好用术语(跨站点请求伪造)来描述。正如@Wiktor在其回复中指出的,通过IP限制访问是不现实的。另外,如果您阅读了CSRF的工作原理,则该漏洞可以从原始IP地址在用户浏览器中运行


好消息是ASP.NET MVC内置了对CSRF预防的支持,这非常容易实现。阅读

如果您在站点上的任何地方都使用HTTPS,并且在web.config中的system.web/authentication/forms元素上设置requireSSL=“true”,则指示浏览器仅通过HTTPS连接传回该cookie。这将防止绝大多数基于流量嗅探的会话劫持攻击,如果您的站点仅为HTTPS,则绝对应该使用它

表单身份验证本质上是无状态的。服务器正在加密以下信息并将其存储在客户端:CookiePath、Expiration、Expired、IsPersistent、IssueDate、Name、UserData、Version。假设您的machineKey没有被破坏,客户端只会将其视为一团加密数据。当它再次将该blob呈现给服务器时,服务器将对其进行解密并将其转换回FormsAuthenticationTicket,根据配置验证ticket中的字段,验证ticket是否过期,等等,并决定是否将请求视为已验证。它不“记得”任何关于哪些票是优秀的。还请注意,它不包括任何IP地址

唯一的真实攻击向量,我可以想到,如果你只是HTTPS,小心保护你的机器密钥,并且将表单AuthCookie设置为AddiScript将是攻击者以客户端的浏览器和/或计算机为目标。理论上,他们可以从内存或磁盘中窃取浏览器空间中的cookie。病毒/特洛伊木马可能会执行此操作,甚至可能是恶意的浏览器扩展。简言之,如果用户可以得到一个有效的、未过期的Forms Auth cookie,他们可以从任何机器上呈现它,直到它过期为止。您可以通过不允许持久身份验证cookie并将超时时间保持在最低限度来降低风险

如果他们有机关枪,他们可以随时从零开始制作FormsAuth饼干

哦。。不能忘记心痛。如果您的负载平衡器或反向代理使用的是不安全的OpenSSL版本,则攻击者可能会破坏您的私钥并通过HTTPS连接拦截流量。ASP.NET不使用OpenSSL,因此您可以在纯MS堆栈中安全地避免这种情况。如果您听说MS的SSL实现中存在漏洞,您会希望尽快对其进行修补,并更改密码并重新颁发证书

如果您担心基于浏览器/机器的劫持,您可能想看看我启动(并放弃)的一个名为Sholo.Web.Security()的项目。它的目标是通过维护服务器上的状态来加强表单身份验证,而牺牲每个请求的一些开销。您可以在服务器端(kick/logout用户)执行撤销票据等操作,并防止用户在IP地址之间移动票据。在Wiktor描述的移动用户旅行场景中,它可能会让人恼火(这是可选的)。您可以自由地使用fork或提交pull请求


0leg提到的反CSRF功能适用于启动登录过程的UI/表单机制,但据我所知,表单身份验证过程本身与CSRF无关。也就是说,一旦cookie被发布到客户端,保护它不在服务器之间跳转的唯一方法就是将cookie限制在为其发布的域/子域中。您的stackoverflow.com cookies将不会呈现给serverfault.com。浏览器会为您处理这些内容。

可能与您所说的“此方案将起作用”重复。当使用https/ssl时,如何获取某人的表单id?[PingPong]我认为这可以使用XSS实现(即使cookie具有安全属性集)。可能还有其他类似特洛伊木马的东西。我不认为OP是指CSRF,因为他们特别声明cookie是从另一个客户端和IP使用的。会话劫持可能意味着访问服务器会话(.NET
Session
object)或窃取表单身份验证设置的身份验证。这两种方法通常都是通过使用来自攻击者自己系统的有效令牌客户端来实现的。