English 中文(简体)
有没有办法防止Cookie被窃取?
原标题:
  • 时间:2008-11-21 01:10:00
  •  标签:

在 Web 2.0 应用程序中,许多用户通常希望保持登录状态(记住我标志),而另一方面,他们的 cookie 可以访问非常私密的数据。有没有办法防止某个窃取 cookie 的人 - 直接从计算机或通过嗅探 - 可以使用 cookie 访问用户的数据?永远使用 HTTPS 不是一个选择。

谢谢,Bernd

连接IP地址到cookie也不是一个选项。

问题回答

亲吻 - 只需使用会话,使您使用已由所选的服务器端脚本语言自动创建的ID。 这很难猜测。 然后,如果它被盗,将访问者的IP地址和用户代理存储在会话中(确保永远不要输出该信息),并且仅在已存储的 IP地址和用户代理匹配远程客户端的匹配时,才认为会话有效 只有

在这种情况下,攻击者需要做以下三件事:

  1. Steal the victim s cookies
  2. Spoof the correct IP address
  3. Spoof the correct User Agent

它也有助于确保攻击者不已经知道所有必须正确接管受害者会话所需执行的事情。例如:他们可能会假设只需要Cookie,然后失败...并通过非常漫长的试错过程来找出其他所有内容。以此方式,您通过晦涩和困难获得安全,这取决于攻击者的技能和他/她对系统的现有知识。

Bernd——使用标准HTTP进行任何事情时的问题在于它是明文的;任何人都可以伪造任何东西。IP欺骗比仅仅偷窃cookie更具挑战性,因此将其与IP绑定在一起是人们通常的做法。就像你所说的,这对于高度动态的环境并不起作用。

我唯一能想到的比较安全的方法是使用HTTPS来放置和验证一个“永久性”cookie,然后在同一个HTTPS会话中放置一个短暂的会话cookie。之后,可以使用会话cookie进行身份验证,使用普通的HTTP进行其余通信。

这样,更少的资源用于支持加密(仅握手),永久性 Cookie 不会被暴露-仅在加密下传输-窃取会话 Cookie 只会带来有限的风险,因为该 Cookie 将很快过期。

所有这些话都说了​​ - 不要让用户在包含真正敏感数据的网站上点击“记住我”!这就是银行不这么做的原因。

希望这有所帮助。

关于将复杂Cookie ID和相关IP存储到数据库中 - 您实际上不必这样做。如果您有秘密密钥K,则仅需要使用您的K加密用户的IP,并将结果{IP}K作为Cookie。只要您的密钥是安全的(而且加密未被破解 - 但如果这发生了,我们会有更大的问题),这是安全的。

也许使用 Session ID 和令牌(基于 IP、一个盐和 Session ID 的哈希值)每次重新生成(使用快速的哈希算法)是一种不错的方法?我目前将会话数据存储在数据库中,这意味着每次请求都需要进行两次查询。其工作方式如下:

  1. Select where SID and TOK match.
  2. Verify a token generated based on current client matches that in the database.
  3. deserialise the data into a property.
  4. Scripts etc happening.
  5. Serialise the updated data, regenerate the SID/TOK, and update DB where SID/TOK = old sid and tok, updated data and new sid and tok. Set the cookie to the new SID and TOK.

通过这种方式,首先,cookie会绑定到我所基于的任何令牌上(在这种情况下,是远程地址),如果被盗并伪造客户端数据,该cookie只能对一个请求有用——当cookie被拦截时,它已经无用了。

我唯一能看到的弱點是,如果攻擊者能夠在真正的使用者發出另一個請求之前,抓住一個 Cookie、欺騙並使用它。有一些解決這個問題的方法,我需要好好思考一下。其開銷為兩個查詢和兩次生成令牌哈希(一次用於驗證,一次用於替換)。

盖上饼干罐的盖子。

开玩笑的,最好的选项已经提出了-将cookie设为模糊的ID,并将其绑定到服务器端的IP地址查找。由于您编辑后说无法将其绑定到IP地址,因此只剩下模糊的ID部分。您在cookie方面的选择受到限制-一旦在客户端放置某些东西,它就会成为风险。

将一个隐秘的ID cookie存储到本地服务器数据库中。根据cookie中提供的ID进行服务器端数据库查找。确保将ID设置得足够复杂,以免轻易被猜测。将ID映射到用户的IP地址。如果他们的IP地址发生了改变,那么强制他们重新登录,并创建一个新的ID。

第二次阅读后,听起来你想要一种高度安全的方式,但同时却束缚了用户的手脚。用户必须有选择保持登录状态的权利,但却会增加他/她的风险。你可以从应用程序和服务器的角度实现全方位的安全保护,但是如果用户忘记在Tim Horton's (加拿大版的星巴克)上桌子上的笔记本电脑,那么这一切都是没有用的。

让用户选择是否保持登录状态,并警告他们信息存在风险。

Bernd - 你说将IP地址连接到cookie不是一个选项,我假设那是因为用户可能通过DHCP连接,因此每次可能使用不同的IP进入。你考虑过将cookie与DNS主机名绑定吗?您可以使用私钥加密Cookie,将其存储在用户的框中。然后每当他们进入时,检查cookie,解密它,然后将用户的当前DNS主机名与cookie中的主机名进行比较。如果匹配,则允许他们进入。如果不匹配,则不允许自动登录。

FYI- 在ASP.Net中获取用户机器的DNS主机名,只需查看

Page.Request.UserHostName




相关问题
热门标签