让django更加努力地防止会话窃取攻击

django-paranoid-sessions的Python项目详细描述


偏执会话:对django会话进行更全面的安全检查

此模块为django实现"偏执会话"-在安全性方面比标准版本要难得多的会话。旨在使
会话窃取攻击尽可能困难,可以使用的额外措施是:

*http头指纹(例如远程地址、http用户代理)
*每个请求的nonce(具有可配置的超时和重复窗口)
*会话密钥的周期性循环
*为秒维护第二个密钥URE连接
*将会话密钥标记为"httponly"

与往常一样,这里有一个折衷方案-这些安全措施包括增加每个请求的处理量
以及更频繁地写入会话存储。您还可能会有终止看起来可疑的有效会话的风险。
但是通过调整此模块提供的各种设置,您应该能够找到适合您的项目的折衷方案。


中间件类=(

'django.contrib.sessions.middleware.sessionmiddleware',
'paranoidsessions.paranoidsessionmiddleware',




根据名称,此模块的默认设置被设计为
,以牺牲性能和用户方便为代价最大限度地提高安全性。
很可能希望将它们调整为更适合您的应用程序的折衷方案,但在这样做之前,您应该了解折衷方案。

来自同一会话的多个请求之间的竞争条件意味着nonce的使用不能完全串行。
如果用户连续快速发送两个请求,以便在收到第一个响应之前发送第二个请求,则这些请求将有效地共享nonce。由于
请求可能由不同的服务器进程处理,这个场景更加复杂。


为了管理这种重叠的请求,这个模块允许在
中有一个小窗口,重复的nonce被视为有效。为了协调跨多个服务器进程的nonce生成
,它们是基于共享的随机种子值从伪随机流
构建的。对于大多数应用程序来说,这应该是足够不可伪造的
-如果您的攻击者有足够的决心破坏以这种方式生成的
nonce,您应该考虑通过安全通道为整个站点提供服务!

以下设置可用于调整此模块的行为:

p会话检查标题:要检查每个请求的标题列表。如果这些头中的任何一个与最初创建会话时发送的头不同,
会话将被清除。

客户端必须在每个请求
时返回有效的nonce,否则会话将被清除。将此值设置为更大的值将降低安全性,但会降低写入会话存储的频率。将其设置为零意味着每个
请求都会生成一个新的nonce。将其设置为"无"将完全禁用nonce的使用。

这对应于任意给定时间服务器和客户机之间可能"正在运行"的nonce
更新数。将其设置为零将中断重叠的请求。

您需要将其设置为大于1,您的站点有一些严重的
性能问题。Django的内置开发服务器
*并不是有一些严重的性能问题;对于您的开发环境,请将其设置为至少3


被接受。此窗口应尽可能小,但如果用户要执行多个重叠请求,则需要

将其设置为"无"表示该窗口永不超时。

会话键将被循环。只有在不使用nonce的情况下才需要这样做;
区别在于密钥循环不需要客户机发送单独的nonce cookie。将其设置为"无"可禁用密钥循环。

default:none





default:"偏执的会话数据"




默认值:"sessionnonce"



psession_secure_cookie_name:用于附加"secure
connections only"会话密钥的cookie的名称。此附加信息仅通过安全连接在服务器和客户端之间传递;如果嗅探器或中间人攻击破坏了所有http通信,
它们仍然无法通过https伪造会话请求。

Ionid_https"



psession_clear_session_函数:在检测到
潜在攻击时调用函数以清除会话。可以给出一个可导入的名称或可调用的对象
,将一个请求对象作为它的唯一参数。


default:lambda req:req.session.flush()


如果此函数返回false,则不会对其进行偏执验证。这可能有助于减少媒体文件等低风险目标上的
处理开销,但
将使攻击者有更多机会破坏给定的nonce。


默认值:lambda req:true



请求,此模块的默认设置可能太严格,将导致有效的用户会话被终止。考虑以下一些调整:

*将nonce_timeout设置为一个较小的正值,例如1秒
*增加nonce_window和nonce_window_timeout值
*过滤对媒体url的请求以减少nonce循环

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java:如何使用另一个类中的对象   如何在Java中迭代旁遮普语(阿拉伯语)?   类Java嵌套ArrayList返回对象   java正则表达式以匹配“:”之后包含的字符串   java为什么main()很好地显示“Lukaku”并包含_names()返回null?   java嵌套循环,无法理解如何编写此代码   java使用maven动物嗅探器插件检查自己的API   java上传的文件创建保存以备将来在GWT服务器端使用   java转换为Dalvik格式失败65536限制   Java后端的javascript最佳RIA工具   amazon web服务如何将tar文件从amazonS3 bucket提取到Java中的另一个s3   java如何在hibernate搜索中实现对int值的搜索?   使用Maven初始化引导层JavaFX时发生java错误   java Google登录API例外:10:   java Glassfish 3.1.2加载本机库(.dll)   java在join操作中使用TumblingWindow,但没有将任何元素传输到my JoinFunction   IBatis+Java:检索HashMap   多线程java与scala在单独线程上读取文件