我正在使用线程本地来存储当前用户和请求对象.通过这种方式,我可以轻松访问程序中任何位置的请求(例如动态表单),而无需传递它们.
为了在中间件中实现线程本地存储,我遵循了Django站点上的教程:http: //code.djangoproject.com/wiki/CookBookThreadlocalsAndUser?version = 18
此文档已经过修改,建议避免使用此技术:http: //code.djangoproject.com/wiki/CookBookThreadlocalsAndUser?version = 20
来自文章:
从设计的角度来看,threadlocals本质上是全局变量,并且受到全局变量通常需要的所有常见的可移植性和可预测性问题的影响.
更重要的是,从安全角度来看,threadlocals构成了巨大的风险.通过提供公开其他线程状态的数据存储,您可以为Web服务器中的一个线程提供一种方法来潜在地修改系统中另一个线程的状态.如果线程本地数据包含用户或其他与身份验证相关的数据的描述,则该数据可以用作授予对未授权用户的访问权的攻击的基础,或者暴露用户的私有细节.虽然有可能建立一个可以抵御这种攻击的线程局域系统,但是防御起来要容易得多,并且建立一个不受任何此类漏洞影响的系统.
我理解为什么全局变量可能很糟糕,但在这种情况下,我在自己的服务器上运行自己的代码,所以我看不出两个全局变量带来的危险.
有人可以解释涉及的安全问题吗?我问过很多人,如果他们阅读这篇文章并知道我正在使用线程本地人,他们会如何破解我的应用程序,但没有人能告诉我.我开始怀疑这是一个由分裂的纯粹主义者所持的观点,他们喜欢明确地传递物品.