关于asp.net:一些黑客可以从用户那里窃取cookie并在网站上以该名称登录?

Can some hacker steal the cookie from a user and login with that name on a web site?

阅读这个问题

不同的用户在aspxanonymous中获得相同的cookie值

我开始想,如果有人真的可以用某种方式窃取cookie,然后把它放在他的浏览器上,然后以管理员的身份登录。

你知道表单认证如何确保即使cookie被篡改,黑客也不会真正使用它登录吗?

或者你知道其他自动防御机制吗?

提前谢谢你。


Is it possible to steal a cookie and
authenticate as an administrator?

是的,有可能,如果表单auth cookie未加密,则有人可以对其cookie进行黑客攻击,以授予他们更高的权限;或者,如果不需要SSL,则复制其他人的cookie。但是,您可以采取以下步骤来降低这些风险:

在system.web/authentication/forms元素上:

  • RequiressL=真。这要求只能通过SSL传输cookie
  • slidingexpiration=false。如果为真,则可以重新激活过期的票据。
  • 无烹饪=假。不要在试图加强安全性的环境中使用无烹饪会话。
  • EnableCrossAppDirects=假。如果为false,则不允许跨应用程序处理cookie。
  • 保护=全部。使用machine.config或web.config中指定的计算机密钥加密和哈希表单auth cookie。此功能将阻止某人黑客自己的cookie,因为此设置告诉系统生成cookie的签名,并且在每次身份验证请求时,将签名与传递的cookie进行比较。
  • 如果您愿意,您可以通过在会话中放置某种身份验证信息来添加一点保护,例如用户用户名的散列(不要将用户名以纯文本形式显示,也不要将其密码以纯文本形式显示)。这将要求攻击者同时窃取会话cookie和表单auth cookie。


    在公共无线环境中会发生cookie被盗的情况。虽然您或我永远不会在这样的环境中操作,但可能无法阻止您的客户这样做。

    如果攻击者知道你连接的是什么安全站点,那么你的浏览器可能会被欺骗,发布到同一个URL的非安全版本。在那一点上你的饼干是妥协。

    这就是为什么除了httpOnlyCookies之外,您还需要指定requireSSL="true"

    1
    <httpCookies httpOnlyCookies="true" requireSSL="true" />

    我不同意鲁克的评论,因为我觉得这不公平;

    @Aristos i updated my answer. But to be honest, if your using a Microsoft development platform your application will be inherently insecure. – The Rook 22 mins ago

    安全不是偶然发生的,也不是"开箱即用"的,至少在我的经验中不是这样。在设计成这样之前,没有什么是安全的,不管平台或工具是什么。


    在许多情况下,用于身份验证的cookie与服务器上的会话相匹配,因此不仅可以获取cookie并"登录",但是,您可能希望了解跨站点请求伪造,这允许恶意使用此cookie的机制:

    http://en.wikipedia.org/wiki/cross-site_request_forgery


    会话ID可以通过多种方式泄露给攻击者。XSS是劫持会话ID最常用的攻击,您应该测试应用程序中的XSS漏洞。.提高会话强度的常用方法是检查IP地址。当用户登录时,记录IP地址。检查每个请求的IP地址,如果IP发生变化,则可能是被劫持的会话。这种安全措施可以阻止合法的请求,但这是不太可能的。

    不要检查x-forwarded-for或用户代理,攻击者修改这些值很简单。

    我还建议在web.config文件中启用httponlycookies:

    1
    <httpCookies httpOnlyCookies="true"/>

    这使得攻击者更难用JavaScript劫持会话,但仍然有可能。


    我正在研究这个问题,我想出了一个主意,我不确定它是否100%安全,但这是一个主意。

    我的想法是每个用户都必须通过登录页面。如果有人偷了cookie,不是通过登录页面,而是直接进入其余页面。他不能通过登录页面,因为不知道真正的密码,所以如果他通过,他还是失败了。

    所以我放置了一个额外的会话值,用户成功地通过了登录页面。现在在每个关键页面中,我检查额外的会话值,如果发现它为空,我就注销并再次请求密码。

    现在我不知道,也许微软已经做好了一切准备,需要更多的检查。

    为了检查这个想法,我使用了这个直接让用户登录的函数。

    1
    FormsAuthentication.SetAuthCookie("UserName", false);

    我的第二个安全性是检查同一个登录用户的不同IP和/或不同cookie。我有很多想法,很多支票(如果是委托书后面的,如果是来自不同国家的,什么是寻找的,我见过他多少次等等),但这是一般的想法。

    这段视频正是我想要阻止的。通过使用我在这里描述的技巧,您不能只设置登录cookie。

    只是分享我的想法…


    我不知道有问题的cookie的具体内容,但是将用户名和密码存储在用户cookie中通常是不好的做法。您通常只希望将用户名和其他非敏感信息存储在cookie中。这样,只有在登录时才会提示用户提供密码。