【问题标题】:Is There a Good Way to Forbid Templates Accessing Related Managers Through Model Instances有没有禁止模板通过模型实例访问相关管理器的好方法
【发布时间】:2012-12-04 17:27:01
【问题描述】:

我需要一种优雅的方式来禁用或授权 Django 模板中的相关字段遍历。

想象一下models.py的以下设置:

class Person(models.Model):
    pass

class Secret(models.Model):
    owner = models.ForeignKey(Person, related_name="secrets")

现在想象一下这个简单的视图,它为模板提供系统中所有 Person 实例的 QuerySet,这样模板就可以将它们放在一个列表中。

def show_people(request):
    render_to_response("people.html", {people=Person.objects.all()})

现在我的问题是我自己不会在这个虚构的系统中提供模板,我也不完全信任制作模板的人。 show_people 视图通过related_name="secrets" 为 people.html 模板提供了 Person 实例的秘密。这个例子很傻,但实际上我有模型结构,模板提供者可以通过相关管理器访问各种易受攻击的数据。

显而易见的解决方案不是为模板提供模型,而是将它们转换为一些更安全的数据对象。但这对我来说会很痛苦,因为系统已经很大并且已经启动并运行了。

我认为一个很酷的解决方案是以某种方式防止模板中的相关字段遍历。另一种解决方案是让此类自定义相关管理器可以访问请求对象并根据request.user 过滤初始查询集。

【问题讨论】:

  • 您不信任的人不应访问敏感数据。让他们在带有假数据的测试环境中设计他们的模板。我知道这不是您问题的直接答案,但这绝对可以避免将来出现麻烦。
  • 我同意这一点。但是在这种情况下,通过信任,我的意思是我不认识制作模板的人。我只是将 Django 应用程序作为第三方模块提供给外部组织,但我要求组织制作自己的模板,因为我不想对他们的 html 施加任何约束,而且我也只对自己的逻辑感兴趣。但我想处理逻辑中的安全性(在视图中),以便模板提供者的责任更小,暴露他们不应该暴露的东西的风险也更小。用一个真实的案例来保持问题的简单是很困难的。

标签: django django-models django-templates


【解决方案1】:

一种可能的解决方案是将自定义 model.Manager 与您的相关模型一起使用。 设置 use_for_related_fields = True 以强制 Django 使用它而不是普通的管理器。根据需要修改管理器以过滤数据。

也看看这个:

Django:using managers for related object access (use_for_related_fields docs)

stackoverflow:use_for_related_fields howto,这里有很好的解释。

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多