C# 表单身份验证安全风险
我使用的是VSTS2008+C++.NET3.5+IIS7.0+ASP.Net。在我对表单身份验证的理解中,为经过身份验证的用户建立了一个会话变量(用于身份验证标识符——即,当用户通过身份验证时,用户将拥有这样一个会话变量,并且该会话变量被实现为cookie) 我对这种模式的关注是,每次用户访问网站中的页面时,会话变量都会传输到服务器端。它可能被黑客嗅探,黑客可以使用这样的会话变量来假装是最终用户?这是安全风险吗 如果存在安全风险,那么我们必须始终使用https进行表单身份验证 提前感谢,,C# 表单身份验证安全风险,c#,.net,asp.net,iis-7,C#,.net,Asp.net,Iis 7,我使用的是VSTS2008+C++.NET3.5+IIS7.0+ASP.Net。在我对表单身份验证的理解中,为经过身份验证的用户建立了一个会话变量(用于身份验证标识符——即,当用户通过身份验证时,用户将拥有这样一个会话变量,并且该会话变量被实现为cookie) 我对这种模式的关注是,每次用户访问网站中的页面时,会话变量都会传输到服务器端。它可能被黑客嗅探,黑客可以使用这样的会话变量来假装是最终用户?这是安全风险吗 如果存在安全风险,那么我们必须始终使用https进行表单身份验证 提前感谢,, 乔
乔治你可以参考这篇文章了解更多信息。这是一个潜在的安全风险,为了提供真正安全的连接,您必须使用HTTPS。是的,通过嗅探通信量可以窃取会话id,因此使用会话进行识别存在安全风险。一般认为,对于非关键站点来说,它是足够安全的,但是如果您有一个安全性非常关键的站点(银行等),那么您需要使用SSL来确保足够安全。对于我们的一个合作伙伴的请求,我也有类似的担忧。。。 (详见此处:) 事实证明,这个“合法”的过程实际上使用了一种叫做“中间人”的黑客方法。在与服务器打交道时,它通过将cookie ID保存在自己的会话上下文中,并为客户端计算机保留一个备用的cookie ID,从技术上说,它假装是用户 因此,理论上这是可以做到的,也是一种威胁。在我看来,如果数据在任何方面都是敏感的,那么使用SSL是正确的方法
有趣的是,在这篇微软支持文章中,措辞让你相信每个请求实际上都是一样的 表单身份验证cookie只是表单身份验证票证的容器。票证作为表单身份验证cookie的值随每个请求一起传递,并由服务器上的表单身份验证用于标识经过身份验证的用户 可以使用3DES加密对cookie进行加密。可以通过将protection属性设置为web.config文件的authentication部分的Validation来启用此功能。使用此设置,服务器将验证每个事务的cookie上的数据。 这增加了一点开销,但是…用户的会话ID没有用作身份验证cookie的一部分-身份验证cookie和会话cookie是分开的。因此,如果网站的某些部分需要身份验证,那么会话ID将不足以进入
话虽如此,如果黑客正在嗅探流量,那么他们也会看到身份验证cookie,因此可以重新创建两者。是的!只需确保在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>
我想与您确认,每次使用初始化网站页面请求时,都将使用用于表单身份验证的相同会话变量?如果不总是相同(例如每次使用随机值),我认为可以。会话id是会话的id,而不是用户的id。当您打开浏览器并访问该站点时,每次都会获得一个新会话。会话在您上次请求后(默认情况下)在服务器上驻留20分钟,此后会话id不再有效,当您访问该站点时,您将获得一个新会话。黑客可以访问会话信息,但不能访问另一个cookie中的用户信息,这也会在浏览器请求中传递,并可能被黑客嗅探。@George2:是的,如果有人在正确的时间、正确的地点使用正确的设备,他们可以嗅探网络流量以获取cookie,并伪造请求以模拟会话。除非所有通信都加密(SSL),否则这总是有风险的。@George2:浏览器不会对cookie进行加密或加扰,您发送到浏览器的内容正是您得到的内容。如果浏览器对该值进行置乱,则该算法将被公开,因为服务器必须能够读取该值,因此它将毫无意义。此外,加扰值与未加扰值一样易于提取和重用,因此不会真正增加任何保护。我想与您确认,每次使用初始化网站页面请求时,都将使用用于表单身份验证的相同会话变量?如果它不是一直都是一样的(例如,每次都会使用一个随机值),我认为这很好。我不认为它一直都是一样的,但我会研究它。如果我是Microsoft,我会这样做。然而,这是值得检查的,因为即使是在最好的系统中也可能存在缺陷……我想我必须同意其他人的观点,即如果数据以任何方式敏感,最好的做法是使用SSL。SSL通过建立一种更安全的整体通信方式而具有额外的价值。如果它每次都改变,则没有什么区别,黑客只需要在合法用户之前使用这些信息。Robban提到了上面的另一篇文章,这篇文章为我们设法打开的这罐蠕虫盖上了盖子。。。杰夫·普洛塞斯是一位才华横溢的头脑和公认的作家。如果他找不到答案,除了写他自己的组件,那么我看不出有多少机会可以。。。不过,我会记住这一点,以备将来参考,永远不会忘记我们