我正在考虑在我的网络应用上实施经典的'remember-me'复选框,以便经过身份验证的用户在返回访问我的网站后能够“记住”。
Gmail,Facebook和其他人都有这种功能,但我不太确定它有多安全。
像Spring Security这样的Java框架使用“基于哈希的令牌方法”。生成的令牌(使用用户名,密码,expirationTime和privateKey)存储在客户端的Cookie令牌= 567whatever567'中。然后,该令牌将在下次回来时重新用于重新验证用户身份。
我担心即使登录过程发生在https连接下,在每个后续的http请求中,cookie都将在网上以未加密的方式发送。
基本上每个人都可以读取令牌并重复使用它进行身份验证。
我正试图了解Gmail或Facebook如何实现此功能。我可以在FB中看到一些Cookie,例如'presence = DJ267619445G09H0L15228675 .....',其他在Gmail中。
我不太确定他们是否会使用其他技巧来防止那些试图模仿其他用户的人。
我会尝试使用类似cURL的内容来冒充自己,看看他们是否只使用特定的令牌来记住用户。
如果它们在我看来就像一个重大的安全问题。也许不是facebook(我不关心它)但是如果你没有设置“Use always https”,那么使用Gmail会使用http连接,它会通过互联网发送你的未加密的令牌。
你觉得怎么样?
我还注意到Facebook用户名/密码字段在http(而非https)下公开。在这方面,我也想知道:所有的网站都露出了用户名/密码字段而不是“不自然”的“不自然”。一旦通过http发送请求,就没有“重定向到https”,可以修复“全局可见的凭据”问题。
由于
修改:
我的担忧是有根据的http://codebutler.com/
感谢Firesheep创作者突出问题!!!
答案 0 :(得分:7)
实现记住我并不是一个问题。你需要做的是让会话保持很长时间(并将cookie设置为持续很长时间)。甚至Gmail也会在一段时间后将您注销(我认为这是两周或一个月)。但是,您需要意识到保持相同的会话打开时间会增加劫持它的可能性。作为对策,您需要增加会话标识符的强度。会话标识符是cookie中的一个(或者在某些软件中常见的URI中为“file.php?PHPSESSID = 1234 ...”)。
关键是要保持强大的会话标识符。例如,在Gmail中,您有一个Cookie GX,其值类似于
DQAAAJoAAAA8mnjaAwgkS7y8Ws5MYCl-PAQLp9ZpMXpGKR47z4L9mlBH-4qEyApAtFbnLkzv1pPqxua1hOWMGiKYpBZr-h7Icyb-NUUg2ZW_nUFIymvw9KjmjSECYTowbCsDerkAxCzSDa83b5YC1mykPv1a9ji4znt6Fsna-AKgNTntvmUxeJ92ctsSlg9iGySEmXnisVyyJiQvI8jzbZqSpE_N2RKZ
会话劫持几乎不可能的原因是,因为会话标识符非常强大,并且因为该站点在任何地方都使用HTTPS。没有人可以猜测或以其他方式获取您的会话标识符(因此无法劫持您的会话)。简而言之,上面的会话标识符似乎有一些~1250位的强度,1 * 10 ^ 376种不同的可能性。没有人能猜到这一点。
显然,总会有潜在的方法来劫持会话。例如,XSS漏洞打开了获取cookie的门户,从而打开了你的会话标识符,但这不是你的会话错误,与“记住我”无关。
我担心即使登录过程发生在https连接下,在每个后续的http请求中,cookie都将在网上以未加密的方式发送。
如果在HTTPS中将cookie安全标志设置为true,则在通过HTTP访问站点时将永远不会发送cookie。对于仅支持HTTPS的站点,这是必须的。
一般来说,人们似乎只使用HTTPS登录页面,这是错误的。如果一个人非常关心,他应该在整个页面上使用HTTPS。否则,就无法阻止所有会话劫持尝试。
为什么许多人仍仅使用HTTPS登录部分?可能是因为他们没有意识到什么是赌注,或者因为CPU太重而无法在任何地方使用HTTPS。但是,使用HTTPS进行登录仍然比不在任何地方使用它更好 - 因为它会对凭据进行加密(因此,以后只会删除会话标识符,而不是登录时的实际凭据)。
也许不是Facebook(我不关心它)但是如果您没有设置“使用始终https”,则使用Gmail将使用http连接,它将通过互联网发送您的未加密的令牌。 你觉得怎么样?
我认为如果可能的话,该值应该在所有情况下都默认为HTTPS。关于为何不使用HTTPS的唯一真正原因是钱(=性能/硬件)。
答案 1 :(得分:3)
它通常被称为重播攻击。攻击者使用您从您那里窃取的相同凭据(例如cookie)重播请求,并且能够冒充您。 XSS攻击只是其中的一种变体,但是可以预防(例如使用HTTPOnly)。
缓解大多数重播攻击的唯一方法是https无处不在。这应该远离大多数窥探的眼睛。
也有lots of prevention techniques。
还有一些硬件设备可以比你在软件中做得更好,在这个过程中减慢你的服务器速度,你可能会弄错。专用硬件可以更好地实时跟踪请求,并确定同一个令牌被许多不同的IP同时使用,并且比单个人类操作员应该能够请求的速度更快。
在ASP.NET 2.0+中,使用表单身份验证时,您可以指定requireSSL='true'
以指示浏览器只应在建立https连接时发送身份验证cookie。有关保护表单身份验证的详细信息,请参阅this msdn article。
不允许remember me
的唯一原因是,如果您是银行或类似的应用程序。如果不是,请遵循一些简单的规则:
remember me
,请在将来的最多30天内对Cookie进行过期,并且不要滑动该值。强制用户每月登录一次并不是那么糟糕。答案 2 :(得分:2)
同意上面的大多数评论。如果你担心安全问题,你应该 -
a)始终使用https。即使gmail最近也默认使用https - 请参阅http://gmailblog.blogspot.com/2010/01/default-https-access-for-gmail.html
b)在会话cookie中设置安全标志,以防止浏览器通过http连接发送它。
c)在您的应用程序中修复XSS。如果您遇到xss问题,那么“记住我”的实现总是不安全的。请参阅OWASP XSS Prevention备忘单。
在会话标识符中包含IP地址无济于事。这样做会使“记住我的功能”变得毫无用处,并且不会增加太多安全性。我知道google肯定不会在其会话标识符中放入IP地址。
答案 3 :(得分:1)
制作完全安全网站的唯一方法是在任何地方启用https。你是对的,可以嗅探cookie,然后用来冒充。
答案 4 :(得分:1)
preventing session hijacking有几种方式,例如存储打开会话的客户端的IP地址。即使没有自动登录功能,也必须在服务器端存储其他数据以验证会话。最好使用nonce作为令牌(或至少以非秘密数据为基础),而不是哈希用户名&密码,因为攻击者可以设想发起攻击以找到给定散列值的身份验证信息。
如果您查看Facebook,Gmail和其他网站的登录表单的来源,登录表单操作将使用HTTPS,然后在登录成功后重定向到非安全页面。
答案 5 :(得分:1)
1 /当用户检查“记住我”时:你存储关于他的计算机的每个信息的哈希值:IP,浏览器,操作系统,语言等......你用他的ID在他的cookie中写下这个哈希 2 /当用户回来时,你计算他的新哈希。您将此值与收到的cookie中的值以及数据库中的值(对于给定的id)进行比较。如果它们都是平等的,您可以对用户进行身份验证。
是否清楚?
如果您有XSS攻击(窃取cookie的最佳方式),Https无法做任何事情