会话伪造/劫持

这不是某个特定的攻击,而是对用户会话数据的通用类攻击。 这种攻击可以采取多种形式:

中间人 攻击:检索所在有线(无线)网络,监听会话数据。伪造会话 :攻击者利用会话ID(可能是通过中间人攻击来获得)将自己伪装成另一个用户。这两种攻击的一个例子可以是在一间咖啡店里的某个攻击者利用店内的无线网络来捕获某个会话cookie,然后她就可以利用那个cookie来假冒原始用户。 她便可以使该cookie来模拟原始用户。伪造cookie :就是指某个攻击者覆盖了在某个cookie中本应该是只读的数据。 第十四章 <../chapter14/>_ 详细介绍了cookies如何工作,以及要点之一的是,它在你不知道的情况下无视浏览器和恶意用户私自改变cookies。Web站点以 IsLoggedIn=1 或者 LoggedInAsUser=jacob 这样的方式来保存cookie由来已久,使用这样的cookie是再简单不过的了。一个更微妙的层面上,然而,相信在cookies中存储的任意信息绝对不是一个好主意。 你永远不知道谁一直在作怪。会话滞留 :攻击者诱骗用户设置或者重设置该用户的会话ID。例如,PHP允许在URL(如 http://example.com/?PHPSESSID=fa90197ca25f6ab40bb1374c510d7a32 等)中传递会话标识符。攻击者欺骗用户点击一个硬编码会话ID的链接,这回导致用户转到那个会话。会话滞留已经运用在钓鱼攻击中,以诱骗用户在攻击者拥有的账号里输入其个人信息。 他可以稍后登陆账户并且检索数据。会话中毒_ :攻击者通过用户提交设置会话数据的Web表单向该用户会话中注入潜在危险数据。一个经典的例子就是一个站点在某个cookie中存储了简单的用户偏好(比如一个页面背景颜色)。 攻击者可以诱骗用户点击一个链接来提交背景颜色,实际上包含了一个XSS攻击。 如果颜色没有转义,那么就可以再把恶意代码注入到用户环境中。

解决方案

有许多基本准则能够保护您不受到这些攻击:

不要在URL中包含任何session信息。Django的session框架(参见第十四章 <../chapter14/>__ )根本不会容许session包含在URL中。不要直接在cookie中保存数据。 相反,存储一个在后台映射到session数据存储的session ID。如果使用Django内置的session框架(即 request.session ),它会自动进行处理。 这个session框架仅在cookie中存储一个session ID,所有的session数据将会被存储在数据库中。如果需要在模板中显示session数据,要记得对其进行转义。 可参考之前的XSS部分,对所有用户提交的数据和浏览器提交的数据进行转义。 对于session信息,应该像用户提交的数据一样对其进行处理。任何可能的地方都要防止攻击者进行session欺骗。尽管去探测究竟是谁劫持了会话ID是几乎不可能的事儿,Django还是内置了保护措施来抵御暴力会话攻击。 会话ID被存在哈希表里(取代了序列数字),这样就阻止了暴力攻击,并且如果一个用户去尝试一个不存在的会话那么她总是会得到一个新的会话ID,这样就阻止了会话滞留。

请注意,以上没有一种准则和工具能够阻止中间人攻击。 这些类型的攻击是几乎不可能被探测的。 如果你的站点允许登陆用户去查看任意敏感数据的话,你应该 总是 通过HTTPS来提供网站服务。 此外,如果你的站点使用SSL,你应该将 SESSION_COOKIE_SECURE 设置为 True ,这样就能够使Django只通过HTTPS发送会话cookie。