【发布时间】:2011-01-15 14:54:04
【问题描述】:
我有一个 Django 应用程序。当以管理员用户身份登录时,我希望能够在 URL 中传递一个秘密参数,并让整个网站的行为就像我是另一个用户一样。
假设我有一个 URL /my-profile/,它显示了当前登录的用户的个人资料。我希望能够执行/my-profile/?__user_id=123 之类的操作,并让底层视图相信我实际上是 ID 为 123 的用户(因此呈现 该用户的个人资料)。
我为什么要那个?
仅仅是因为重现某些只出现在单个用户帐户中的错误要容易得多。
我的问题:
实现这样的事情最简单的方法是什么?
在执行此操作时,我是否应该考虑任何安全问题?请注意,我(显然)只想为管理员用户提供此功能,而我们的管理员用户无论如何都可以完全访问源代码、数据库等,所以它并不是真正的“后门”;它只是让更容易访问用户的帐户。
【问题讨论】:
-
是的,它是一个后门。如果你能破解这个功能,你就可以冒充任何人。此外,它还允许管理员像用户一样进行编辑,这样编辑在日志中显示为用户,而实际上它是另一个用户,等等。
-
Django 管理员无论如何都可以从管理界面编辑任何内容。正如我所说,我们的管理员可以完全访问源代码、数据库、服务器等。如果他们想代表用户做某事,他们可以使用纯 SQL 来完成。所以我真的不明白提供一种更友好的方式是多么危险。
-
另外,请注意,我们不在金融/银行/任何法规实际上可能合法地阻止我们这样做的行业。我们只是提供我们提供的服务,我们希望尽可能顺利地为客户提供支持。而已。 :)
-
使用我在下面发布的这段代码,管理员不能做任何事情,并使其“看起来像另一个用户做了”。模拟仅适用于 GET 请求。它仅用于调试页面在某些异常情况下呈现的方式。为了模拟动作,我总是可以写一个单元测试。
-
这不是一个安全漏洞,而且非常有用。如果用户抱怨某些内容未正确呈现或权限不起作用,则冒充该用户通常是重现问题的最实用方法。在 unix 中,管理员可以执行此操作。这是同一件事。如果该功能仅限于“超级”管理员,这是完全合理的,但当然必须像使用任何管理员功能一样谨慎使用。
标签: python django impersonation