【问题标题】:Forms authentication security risk表单认证安全风险
【发布时间】:2009-09-15 09:25:44
【问题描述】:

我正在使用 VSTS 2008 + C# + .Net 3.5 + IIS 7.0 + ASP.Net。在我对表单身份验证的理解中,为经过身份验证的用户建立了一个会话变量(用于身份验证标识符 - 即当用户通过身份验证时,用户将拥有这样一个会话变量,并且会话变量被实现为 cookie)。

我对这种模式的关注是,每次用户访问网站中的一个页面时,会话变量都会被传输到服务器端。它可能被黑客嗅探,黑客可以使用这样的会话变量来冒充最终用户吗?这会带来安全风险吗?

如果是安全隐患,那我们就得一直用https来做Forms认证?

提前致谢, 乔治

【问题讨论】:

    标签: c# .net asp.net iis-7


    【解决方案1】:

    用户的会话 ID 用作身份验证 cookie 的一部分 - 身份验证 cookie 和会话 cookie 是分开的。因此,如果您的网站的某些部分需要身份验证,那么会话 ID 将不足以进入。

    话虽如此,如果黑客正在嗅探流量,那么他们也会看到身份验证 cookie,因此可以重新创建两者。

    【讨论】:

    • 谢谢blowdart,身份验证cookie 我想你的意思是“.ASPXAUTH”会话cookie?对于“用户的会话 ID”,您的意思是?
    • 实际上,在这个讨论中,当我说身份验证会话变量时,我的意思是“.ASPXAUTH”。有没有cmets?
    • 为什么你认为它是一个变量?保存会话标识符的会话 cookie 被命名为 asp.net_sessionid (尽管您可以更改它)它只保存一个 guid - 没有会话变量保存在其中。表单身份验证 cookie 更复杂(并且签名防止篡改)。会话 ID 的泄露不会对用户进行身份验证,但
    • 感谢吹镖,抱歉我的描述不好。我的观点是,如果不使用 https,黑客可以同时嗅探它们(因为它们每个都在每个请求中传输到网站)。有cmets吗?顺便说一句:我使用了一个坏词变量,我应该说会话 cookie。
    【解决方案2】:

    对于我们的一位合作伙伴提出的请求,我也有类似的担忧…… (详见此处:https://stackoverflow.com/questions/1367574/rewriting-urls-using-reverse-proxy

    事实证明,这个“合法”过程实际上使用了一种称为“中间人”的黑客方法。从技术上讲,它通过在与服务器打交道时将 cookie ID 保留在自己的会话上下文中并为客户端计算机保留一个独立的会话上下文来伪装成用户。

    所以,理论上是可以做到的,这是一种威胁。如果数据在任何方面都是敏感的,我认为使用 SSL 是正确的方法。


    在这篇 Microsoft 支持文章 http://support.microsoft.com/kb/910443 中很有趣,措辞让您相信每个请求实际上都是相同的......

    表单身份验证 cookie 只不过是表单身份验证票的容器。票据作为表单身份验证 cookie 的值与每个请求一起传递,并由服务器上的表单身份验证使用,以识别经过身份验证的用户。

    可以使用 3DES 加密对 cookie 进行加密。这可以通过将保护属性设置为 web.config 文件的身份验证部分的 Validation 来启用。使用此设置,服务器会为每笔交易验证 cookie 上的数据。 不过,这会增加一些开销...

    【讨论】:

    • 我不认为它一直都是一样的,但我会调查一下。
    • 如果我是微软,我会那样做。但是,值得检查,因为即使在最好的系统中也可能存在缺陷......
    • 我认为我必须同意其他人的观点,即如果数据以任何方式敏感,最佳做法是使用 SSL。 SSL 通过建立更安全的整体通信方式具有附加价值。
    • 如果每次都改变也没关系,黑客只需要在合法用户之前使用这些信息。
    • Robban 在上面提到的另一篇文章中提到了我们设法打开的这罐蠕虫的盖子……杰夫·普罗西斯(Jeff Prosise)是一位聪明的大脑,也是一位公认的作家。如果他找不到答案,除了编写他自己的组件之外,我看不出有多少机会可以......但是,我会记住这一点以供将来参考,并且永远不要在没有 SSL 的情况下使用 Froms 身份验证.
    【解决方案3】:

    您可以参考question 了解更多信息。这是一个潜在的安全风险,要提供真正安全的连接,您必须使用 HTTPS。

    【讨论】:

    • 我想与您确认每次用于表单身份验证的相同会话变量将在每次使用初始化请求到网站的页面时使用?如果不是一直都一样(比如每次都会使用一个随机值),我觉得没问题。
    【解决方案4】:

    是的,通过嗅探流量可以窃取会话 ID,因此使用会话进行识别存在安全风险。对于非关键站点,它通常被认为足够安全,但如果您有一个安全性至关重要的站点(银行等),则需要使用 SSL 以确保足够安全。

    【讨论】:

    • 我想与您确认每次用于表单身份验证的相同会话变量将在每次使用初始化请求到网站的页面时使用?如果不是一直都一样(比如每次都会使用一个随机值),我觉得没问题。
    • 会话 ID 是会话的 ID,而不是用户的 ID。当您打开浏览器并访问该站点时,您每次都会获得一个新会话。会话在您上次请求后在服务器上存在 20 分钟(默认情况下),之后会话 ID 不再有效,当您访问该站点时会获得一个新会话。
    • 黑客可以访问会话信息,但不能访问用户信息,即在另一个cookie中,该信息也将在浏览器请求中传递并可能被黑客嗅探。
    • @George2:是的,如果有人在正确的时间和正确的地点使用正确的设备,他们可以嗅探网络流量以获取 cookie,并欺骗模拟会话的请求。除非所有流量都经过加密 (SSL),否则始终存在风险。
    • @George2:浏览器不会对 cookie 进行加扰或加密,您发送给浏览器的内容正是您返回的内容。如果浏览器会打乱该值,则该算法将被公开,因为服务器必须能够读取它,因此它将毫无意义。此外,加扰的值与未加扰的值一样容易拾取和重用,因此它不会真正增加任何保护。
    【解决方案5】:

    是的!只需确保在您的 web.config 表单标签上添加:requireSSL="true"

    <authentication mode="Forms">
        <forms loginUrl="~/Account/LogOn" timeout="2880" requireSSL="true" />
      </authentication>
    

    然后您还可以使用一些重写来确保在需要身份验证的页面或目录上使用 https。在 MVC 上,您可以使用 [RequireHttps] 过滤器属性。

          <rewriteMap name="SSL_Required_pages" defaultValue="">
            <add key="/simulacao-seguro-automovel.aspx" value="/simulacao-seguro-automovel.aspx" />
          </rewriteMap>
          <rule name="Enforce SSL pages">
            <match url="(.*)" />
            <conditions>
              <add input="{SSL_Required_pages:{HTTP_URL}}" pattern="(.+)" />
              <add input="{HTTPS}" pattern="off" />
              <add input="{HTTP_HOST}" pattern="mysite\.com" />
            </conditions>
            <action type="Redirect" url="https://mysite.com/{R:1}" redirectType="Permanent" />
          </rule>
          <rule name="Enforce SSL to secure directories">
            <match url="(.*)" />
            <conditions>
              <add input="{PATH_INFO}" pattern="^/admin/|^/admin|^/fale-conosco/|^/fale-conosco" />
              <add input="{HTTPS}" pattern="off" />
              <add input="{HTTP_HOST}" pattern="mysite\.com" />
            </conditions>
            <action type="Redirect" url="https://www.mysite.com/{R:1}" redirectType="Permanent" />
          </rule>
    

    【讨论】:

      猜你喜欢
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多