如何在 Django 中防止会话劫持?
会话劫持或会话伪造是大多数网站容易受到攻击的另一个安全问题。在本文中,我们将进一步了解这种攻击以及如何保护您的网站免受其侵害。
这是一类广泛的用户会话数据攻击,而不是具体的攻击。它有多种形式,如下所述。
中间人攻击发生在攻击者拦截网络上传输的会话数据时。
Cookie 伪造攻击是另一种类型,其中攻击者会更改保存在 Cookie 中的看似只读数据。保存了诸如 IsLoggedIn=1 或 LoggedInAsUser=ram 之类的 Cookie 的网站有着悠久的历史。利用这些 Cookie 易如反掌。
因此,您永远不应该相信存储在 Cookie 中的任何内容;您永远不知道谁一直在挖掘它们。
攻击者可以使用会话固定来欺骗用户更改或重置其会话 ID。
例如,PHP 允许使用会话标识符。这些会话 ID 必须在 URL 中给出(例如,http://exg.com/?PHPSESSID=gja65k02n93a32)。
攻击者使用可能通过中间人攻击获得的会话 ID 来假装成另一个用户。
例如,在购物中心,攻击者可能会使用商店的无线网络来捕获会话 Cookie。然后,她可以使用该 Cookie 模仿原始用户。
当用户被诱骗点击包含硬编码会话 ID 的链接时,该会话会被用户获取。网络钓鱼攻击利用会话固定来欺骗用户将其个人信息输入到攻击者控制的帐户中。他稍后可以通过登录该帐户来检索信息。
攻击者将潜在的危险材料注入用户的会话中,这被称为会话中毒。这通常通过用户填写以设置会话数据的 Web 表单来完成。
以上是一些会话可能被伪造的方式。现在我们将了解如何克服会话劫持的威胁。
会话劫持的解决方案
有一些广泛的指南可以帮助您避免这些攻击 -
允许会话信息包含在 URL 中从来都不是一个好主意。Django 中的会话机制根本不允许将会话包含在 URL 中。
不要直接将数据存储在 Cookie 中,而是存储一个与后端维护的会话数据相对应的会话 ID。如果您使用 Django 的内置会话框架 request.session,则会自动为您处理此问题。会话框架仅使用单个会话 ID Cookie。数据库存储所有会话数据。
如果您想在模板中显示会话数据,请记住对其进行转义。
在任何可能的情况下,阻止攻击者欺骗会话 ID。尽管检测到劫持了会话 ID 的人几乎是不可能的,但 Django 具有针对暴力破解会话攻击的内置保护。会话 ID 存储为哈希值而不是连续整数,以防止暴力破解攻击,如果用户尝试不存在的会话 ID,她将始终获得一个新的会话 ID,从而防止会话固定。
这些概念或技术都不能防止中间人攻击。识别此类攻击几乎是不可能的。如果登录用户可以访问您网站上的敏感数据,则应始终通过 HTTPS 提供服务。
最后,如果您启用了 SSL 的站点,请将 SESSION COOKIE SECURE 设置为 True;这将强制 Django 仅通过 HTTPS 传输会话 Cookie。
通过这些方式,可以控制和监控会话劫持。