在Web 2.0应用程序中,许多用户通常希望保持登录状态(“记住我”标志),另一方面,他们的cookie可以访问非常私密的数据。有没有办法防止那些窃取cookie的人 - 直接从计算机或通过嗅探 - 可以使用cookie来访问用户的数据?始终不支持HTTPS。
谢谢,Bernd
[编辑]也不能选择将IP地址连接到cookie。
答案 0 :(得分:6)
Bernd - 通过标准HTTP完成任何事情的麻烦在于它是纯文本;任何人都可以伪装。 IP欺骗比纯粹的cookie窃取更具挑战性,因此与IP绑定往往是人们所做的。就像你说的那样,这对于高度动态的环境来说效果不佳。
我能想到的唯一最安全的方法是使用HTTPS来放置和验证“永久”cookie,然后放置(在同一个HTTPS会话中)一个短期会话cookie。其余的通信可以通过常规HTTP完成,使用会话cookie进行身份验证。
这样,用于支持加密(仅握手)的资源就会减少,永久性cookie不会暴露 - 它只会在加密下传输 - 并且窃取会话cookie只会带来有限的风险,因为该cookie将会快点过期。
所有这一切 - 不要让用户在包含真正敏感数据的网站上点击“记住我”!这就是为什么班克斯不这样做..
希望这有帮助。
答案 1 :(得分:6)
KISS - 只需使用会话,这样您就可以使用已经由您选择的服务器端脚本语言自动创建的ID。这很难猜到。然后,如果它被盗,请将访问者的IP地址和用户代理存储在会话中(确保永远不会输出)并且仅在 已经存储的时才认为会话有效 / em> IP地址和用户代理匹配为远程客户端找到的内容。
在这种情况下,攻击者必须执行以下三项操作:
它还有助于确保攻击者不知道他/她为了正确接管受害者的会话而必须做的所有事情。 IE:他们可能会假设只需要cookie然后失败......并且必须通过非常长的试验和错误来弄清楚其他所有内容。通过这种方式,您可以通过默默无闻和困难获得安全性,具体取决于攻击者的技能和他/她对系统的现有知识。
答案 2 :(得分:3)
关于在数据库中存储复杂的cookie ID和关联的IP - 您实际上不必这样做。如果你有一个密钥K,用你的K加密用户的ip就足够了,并将结果{IP} K作为cookie。只要你的密钥是安全的(并且密码没有被破坏 - 但如果发生这种情况,我们会遇到更大的问题),这是安全的。
答案 3 :(得分:2)
使用会话ID和令牌(基于IP,盐和会话ID的哈希),每次请求重新生成(使用快速哈希算法)都是一种好方法吗?我将会话数据存储在数据库中(当前),这意味着每个请求都有两个查询开销。它的工作原理如下:
通过这种方式,首先cookie被绑定到我基于令牌的任何东西(在这种情况下,远程地址),如果它被盗并且客户端数据被欺骗,那么cookie只对一个请求有用 - 无论如何cookie被截获,没用。
我能看到的唯一可感知的弱点是,在真人可以做另一个请求之前,攻击者设法抓住一个cookie,欺骗并使用它。我需要考虑几种方法来解决这个问题。开销是两个查询并生成两次令牌哈希(一次用于验证,一次用于替换)。
答案 4 :(得分:1)
将一个不明确的ID存储到本地服务器数据库中。根据cookie中提供的ID执行服务器端数据库查找。务必使ID足够复杂,以至于无法轻易猜到。将ID映射到用户的IP地址。如果他们的IP发生了变化,请强制他们再次登录,并创建一个新ID。
在第二次阅读时,听起来你需要双手绑住高水平的安全性。用户必须选择保持登录状态,从而增加他/她的风险。您可以从应用程序和服务器的角度实现世界上所有的安全性,但如果用户在Tim Horton(加拿大星巴克)的桌子上忘记了他们的笔记本电脑,那么它们都不会对您有所帮助。
让用户选择是否仍然登录,并向他们发出有关他们的信息存在风险的警告。
答案 5 :(得分:1)
盖上饼干罐。
除了笑话之外,最好的选择已经说明了 - 让cookie成为一个不起眼的ID,并将其与服务器端的IP地址查询联系起来。由于您编辑后说您无法将其绑定到IP地址,因此会留下不明确的ID部分。您的选择受限于cookie - 只要您在客户端放置某些东西,就会有风险。
答案 6 :(得分:0)
Bernd - 你说将IP地址连接到cookie不是一个选项,我假设用户可以通过DHCP连接b / c,因此每次都可以使用不同的IP。您是否考虑过将cookie绑定到DNS主机名?您可以使用私钥加密cookie,并将其存储在用户的盒子中。然后,只要他们进来,检查cookie,取消加密,然后检查用户当前的DNS主机名与cookie中的名称。如果匹配,则允许它们进入。如果不匹配,则不允许自动登录。
仅供参考 - 在ASP.Net中,要获取用户盒子的DNS主机名,请查看
Page.Request.UserHostName