mic*_*son 11 security cookies https web-applications remember-me
我正在考虑在我的webapp上实现经典的"记住我"复选框,以便在他返回访问我的网站后让被认证的用户"记住".
Gmail,Facebook和其他人都有这种功能,但我不太确定它有多安全.
像Spring Security这样的Java框架使用"基于哈希的令牌方法".生成的令牌(使用用户名,密码,expirationTime和privateKey)存储在客户端的Cookie令牌= 567whatever567'中.然后重新使用该令牌以在下次回来时重新验证用户.
我担心的是,即使登录过程发生在https连接下,在每个后续的http请求中,cookie都将在网络上以未加密的方式发送.
基本上每个人都可以读取令牌并重复使用它进行身份验证.
我正试图了解Gmail或Facebook如何实现此功能.我可以在FB中看到一些像'presence = DJ267619445G09H0L15228675 .....'的Cookie,其他在Gmail中.
我不太确定他们是否使用其他技巧来防止那些试图模仿其他用户的人.
我会尝试使用类似cURL的东西冒充自己,看看他们是否只使用特定的令牌来记住用户.
如果它们在我看来就像一个重大的安全问题.也许不是Facebook(我不关心它)但是如果你没有设置' 使用始终https ',将使用 Gmail 连接,它将通过互联网发送你的未加密的令牌.
你怎么看?
我还注意到Facebook用户名/密码字段在http(而不是https)下公开.在这方面,我也想知道:所有的网站都露出了用户名/密码字段而不是"不自然"的"不自然".通过http发送请求后,没有"重定向到https"可以修复"全局可见的凭据"问题.
谢谢
编辑:
我的担忧是有根据的http://codebutler.com/
感谢Firesheep创作者突出问题!
实现一个记住我并不是一个问题.你需要做的是让会话保持很长时间(并将cookie设置为持续很长时间).甚至Gmail也会在一段时间后将您注销(我认为这是两周或一个月).但是,您需要意识到保持相同的会话打开时间会增加劫持它的可能性.作为对策,您需要增加会话标识符的强度.会话标识符是cookie中的一个(或者在某些软件中常见的URI中为"file.php?PHPSESSID = 1234 ...").
关键是要保持强大的会话标识符.例如,在Gmail中,您有一个Cookie GX,其值类似于
DQAAAJoAAAA8mnjaAwgkS7y8Ws5MYCl-PAQLp9ZpMXpGKR47z4L9mlBH-4qEyApAtFbnLkzv1pPqxua1hOWMGiKYpBZr-h7Icyb-NUUg2ZW_nUFIymvw9KjmjSECYTowbCsDerkAxCzSDa83b5YC1mykPv1a9ji4znt6Fsna-AKgNTntvmUxeJ92ctsSlg9iGySEmXnisVyyJiQvI8jzbZqSpE_N2RKZ
Run Code Online (Sandbox Code Playgroud)
Session Hijacking几乎不可能的原因是,因为会话标识符非常强大,并且因为该站点在任何地方都使用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连接,它将通过互联网发送你的未加密的令牌.你怎么看?
我认为如果可能的话,在所有情况下,该值都应默认为HTTPS.关于为什么不使用HTTPS的唯一真正原因是钱(=性能/硬件).