问题 “记住我”身份验证功能,是否始终意味着“不安全”网站?
我正在考虑实施经典 '记住我'复选框 在我的webapp上,一旦他返回访问我的网站,就允许被认证的用户被“记住”。
Gmail的, Facebook的 和其他人有这样的功能,但我不太确定它有多安全。
像Java框架一样 春季安全 使用'基于哈希的令牌方法'。生成的令牌(使用用户名,密码,expirationTime和privateKey)存储在客户端的Cookie令牌= 567whatever567'中。然后重新使用该令牌以在下次回来时重新验证用户。
我担心的是,即使登录过程发生在https连接下,在每个后续的http请求中,cookie都将在网上以未加密的方式发送。
基本上 每个人 可以读取令牌并重复使用它进行身份验证。
我正试图了解Gmail或Facebook如何实现此功能。我可以在FB中看到一些像'presence = DJ267619445G09H0L15228675 .....'的Cookie,其他在Gmail中。
我不太确定他们是否使用其他技巧来防止那些试图模仿其他用户的人。
我会尝试用类似的东西冒充我自己 卷曲 看他们是否只使用特定令牌来记住用户。
如果它们在我看来就像是一个很大的安全问题。也许不是Facebook(我不关心它),但如果你没有设置'始终使用https'将使用http连接,它将通过互联网发送未加密的令牌。
你怎么看?
我还注意到Facebook用户名/密码字段在http(而不是https)下公开。在这方面,我也想知道:所有的网站都露出了用户名/密码字段而不是“不自然”的“不安全”。一旦通过http发送请求,就没有“重定向到https”,可以修复“全局可见的凭据”问题。
谢谢
编辑:
我的担忧是有根据的 http://codebutler.com/
感谢 Firesheep 突出问题的创作者!
5330
2018-03-03 13:01
起源
答案:
实现一个记住我并不是一个问题。你需要做的是让会话保持很长时间(并将cookie设置为持续很长时间)。甚至Gmail也会在一段时间后将您注销(我认为这是两周或一个月)。但是,您需要意识到保持相同的会话打开时间会增加劫持它的可能性。作为对策,您需要增加会话标识符的强度。会话标识符是cookie中的一个(或者在某些软件中常见的URI中为“file.php?PHPSESSID = 1234 ...”)。
关键是要保持强大的会话标识符。例如,在Gmail中,您有一个Cookie GX,其值类似于
DQAAAJoAAAA8mnjaAwgkS7y8Ws5MYCl-PAQLp9ZpMXpGKR47z4L9mlBH-4qEyApAtFbnLkzv1pPqxua1hOWMGiKYpBZr-h7Icyb-NUUg2ZW_nUFIymvw9KjmjSECYTowbCsDerkAxCzSDa83b5YC1mykPv1a9ji4znt6Fsna-AKgNTntvmUxeJ92ctsSlg9iGySEmXnisVyyJiQvI8jzbZqSpE_N2RKZ
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',将使用一个http连接,它将通过互联网发送你的未加密的令牌。
你怎么看?
我认为如果可能的话,该值应该在所有情况下都默认为HTTPS。关于为什么不使用HTTPS的唯一真正原因是钱(=性能/硬件)。
7
2018-03-03 19:19
答案:
实现一个记住我并不是一个问题。你需要做的是让会话保持很长时间(并将cookie设置为持续很长时间)。甚至Gmail也会在一段时间后将您注销(我认为这是两周或一个月)。但是,您需要意识到保持相同的会话打开时间会增加劫持它的可能性。作为对策,您需要增加会话标识符的强度。会话标识符是cookie中的一个(或者在某些软件中常见的URI中为“file.php?PHPSESSID = 1234 ...”)。
关键是要保持强大的会话标识符。例如,在Gmail中,您有一个Cookie GX,其值类似于
DQAAAJoAAAA8mnjaAwgkS7y8Ws5MYCl-PAQLp9ZpMXpGKR47z4L9mlBH-4qEyApAtFbnLkzv1pPqxua1hOWMGiKYpBZr-h7Icyb-NUUg2ZW_nUFIymvw9KjmjSECYTowbCsDerkAxCzSDa83b5YC1mykPv1a9ji4znt6Fsna-AKgNTntvmUxeJ92ctsSlg9iGySEmXnisVyyJiQvI8jzbZqSpE_N2RKZ
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',将使用一个http连接,它将通过互联网发送你的未加密的令牌。
你怎么看?
我认为如果可能的话,该值应该在所有情况下都默认为HTTPS。关于为什么不使用HTTPS的唯一真正原因是钱(=性能/硬件)。
7
2018-03-03 19:19
它通常被称为重播攻击。攻击者使用您从中窃取的相同凭据(例如cookie)重播请求,并且能够冒充您。 XSS攻击只是其中的一种变体,但是可以预防(例如使用HTTPOnly)。
缓解大多数重播攻击的唯一方法是https无处不在。这应该远离大多数窥探的眼睛。
有 很多预防技巧 太。
还有一些硬件设备可以比你在软件中做得更好,在这个过程中减慢你的服务器速度,你可能会弄错。专用硬件可以更好地实时跟踪请求,并确定同一个令牌被许多不同的IP同时使用,并且比单个人类操作员应该能够请求的速度更快。
在ASP.NET 2.0+中,使用表单身份验证时,您可以指定 requireSSL='true'
表示浏览器只应在建立https连接时发送身份验证cookie。看到 这篇msdn文章 有关保护表单身份验证的更多信息
唯一不允许的理由 remember me
如果你是银行或类似的应用程序。如果你不是,只需遵循一些简单的规则:
- 如果你有
remember me
,将来最多30天在cookie上过期,不要滑动价值。强制用户每月登录一次并不是那么糟糕。
- 任何敏感操作 要求 密码更新结算,信用卡或帐户详细信息时 总是 重新请求用户密码。最可能的滥用形式通常是通过该人使用的同一台计算机,但它也确保即使是被盗的身份验证cookie也不会造成太大的伤害。你可以看到我的余额,但你不能转移任何东西。
3
2018-03-04 04:01
同意上面的大多数评论。如果您担心安全问题,您应该 -
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地址。
2
2018-03-04 03:14
制作完全安全的网站的唯一方法是在任何地方启用https。你是对的,可以嗅探cookie,然后用来冒充。
1
2018-03-03 13:05
有几种方法 防止会话劫持,例如存储打开会话的客户端的IP地址。即使没有自动登录功能,也必须在服务器端存储其他数据以验证会话。最好使用一个 现时 对于令牌(或至少基于非秘密数据)而不是散列的用户名和密码,因为攻击者可以设想发起攻击以找到给定散列值的身份验证信息。
如果您查看Facebook,Gmail和其他网站的登录表单的来源,登录表单操作将使用HTTPS,然后在登录成功后重定向到非安全页面。
1
2018-03-03 13:22
1 /当用户检查“记住我”时:你存储关于他的计算机的每个信息的哈希:IP,浏览器,操作系统,语言等......你用他的ID在他的cookie中写下这个哈希
2 /当用户回来时,你计算他的新哈希。您将此值与收到的cookie中的值以及数据库中的值(对于给定的id)进行比较。如果它们都是等于,则可以对用户进行身份验证。
清楚吗 ?
如果您有XSS攻击,Https无法做任何事情(窃取cookie的最佳方法)
1
2018-03-03 14:21