窃取会话ID Cookie - 对策

4
很容易通过其他用户在受信任的网站上植入的javascript函数窃取会话ID cookie。有哪些可能的对抗措施?
拒绝客户端所有javascript脚本可能很困难,因为几乎所有网站都使用js。服务器端可能有哪些可能的对抗措施?是否可以在会话ID值中包含客户端IP地址的哈希值,以防止从另一个主机使用有效的会话ID?这种方法是否可行?
在您宝贵答案提到的资源之一中,提出了在每个请求后更改会话ID的解决方案。应用程序服务器/框架已经支持此功能吗?特别是Django / python如何?

如果一个恶意网站进入了受信任的站点区域,无论您的站点如何,用户都会受到影响。不管怎样,受信任的站点如何从另一个域中读取cookie?如果真的可能,那么恶意的受信任站点可以利用客户端的劫持会话ID,在这种情况下,IP过滤也无济于事。 - Robert Levy
1
如果你在每个请求后重新生成会话ID,那么你将破坏用户使用返回按钮的能力。你提到的维基百科文章只建议在成功登录后重新生成会话ID。 - Robert Levy
5个回答

4

将IP地址映射到会话真的很麻烦,因为你无法保证人们不使用代理,而这些代理可以轻易地更改IP地址。

最好的方法是使用SSL,并使您的cookie成为HTTP-only


4
@Alfred 如果你正在使用公共网络连接,SSL 可以帮助防止会话劫持。 - HoLyVieR

2

您需要指定某些Cookie应用于某个主机、域名、子域名或其他内容。Cookies支持这一点。

我认为您无法从其他域访问Cookie。


我认为你没有很好地理解这个问题,他的意思是将IP存储在会话中,以便他可以检查会话和IP是否匹配。 - HoLyVieR
1
嘿,也许你是对的,但实际上,他说关于IP的事情是他解决问题的建议。这就是为什么我回答了这个问题,并跳过了IP的事情,因为它与这种方法无关(不可靠)。 - Matías Fidemraizer

1
在会话ID值中包含客户端IP地址的哈希值,以防止其他主机使用有效的会话ID,这种方法可行吗?这可以在某些情况下阻止会话劫持,但在攻击者计算机和受害者计算机位于同一网络的情况下,它将无济于事,因为连接来自相同的IP地址。
服务器端可能的对策是什么?
如果一个人连接到公共网络,使用SSL将有助于防止会话劫持。
您可以检查您的代码,确保您的代码中没有XSS漏洞。
您还可以确保用于存储会话的cookie具有HTTP Only标志。

1
  • 只安装你信任的JavaScript。如果你对代码不确定,检查源代码(可能使用某种XSS扫描器)。
  • 使用以下简单的JavaScript片段过滤你的JavaScript(来自输入):

    function sanitize(html){
    `return String(html)
    .replace(/&(?!\w+;)/g, '&')
    .replace(/ .replace(/>/g, '>')
    .replace(/"/g, '"');
    }

必须在服务器端进行良好的过滤(输入)。例如,PHP有过滤扩展


如果您包含外部JavaScript,您的消毒剂是否也会起作用? - paweloque
这取决于你如何定义外部 JavaScript。如果你从 JSON 或用户输入等方式获取它,那么是安全的。但是在 HTML 中的脚本标签(<script src='a.js'>)是不安全的! - Alfred

1

这被称为XSS。最好的解决方案是在客户端上首先防止植入JavaScript代码。

一个有趣的解决方案是为每个用户操作提供基于令牌的身份验证。查看OWASP CSRF页面以获取更多信息。

编辑:正如评论所说,令牌无法帮助缓解会话劫持问题。正如维基百科关于会话劫持所说,最佳解决方案是在每次页面重新加载时旋转会话ID。


基于令牌的身份验证与会话劫持无关,但这并不能阻止它。 - HoLyVieR
你知道框架/应用服务器是否“开箱即用”地支持旋转会话ID吗? - paweloque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接