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