【问题标题】:Secure-by-default django ORM layer---how?默认安全的 django ORM 层---如何?
【发布时间】:2013-02-17 04:28:09
【问题描述】:

我正在经营一家 Django 商店,我们为每个客户提供一个与所有其他客户的图完全分离的对象图。这些数据属于中等敏感数据,因此我不希望任何数据从一个客户端泄露到另一个客户端,也不希望一个客户端删除或更改另一个客户端的数据。

我想构建我的代码,以便我在默认情况下编写符合安全要求的代码(不需要保证),但是当我知道我需要时让我覆盖它们。

我主要担心的是,在Twig.objects.get(...) 中,我忘记添加client=request.client,同样对于Leaf.objects.get,我必须检查twig__client=request.client。这很快就会变得容易出错和复杂。

有什么好方法可以解决我自己的健忘问题?我怎样才能让这件事成为我不必考虑的事情?

【问题讨论】:

  • 自定义管理器绝对是最佳选择

标签: django security defensive-programming


【解决方案1】:

我想到的一个候选解决方案是:

  • 在我的抽象基类上将默认对象管理器设置为DANGER = models.Manager()
  • 在所述基类上有一个方法ok(request),该方法在适用时应用.filter(leaf__twig__branch__trunk__root__client=request.client)
  • 在可行的情况下使用MyModel.ok(request) 而不是MyModel.objects

这可以改进吗?一个不太好的问题是当视图调用模型方法时,例如branch.get_twigs_with_fruit,我现在必须传递 request 以使其通过 ok,或者我必须调用 DANGER。我都不喜欢:-\

有什么方法可以访问当前请求吗?我认为这可能会缓解这种情况......

【讨论】:

    【解决方案2】:

    我会解释我遇到的另一个问题,但我认为解决方案可能需要研究。

    有一次我正在处理一个可视化数据的项目,我需要一个非常大的表格来存储所有可视化的所有数据。结果证明这是一个大问题,因为我必须做类似Model.objects.filter(visualization=5) 这样的事情,这不是很优雅而且效率不高。

    为了让事情变得更简单、更高效,我最终动态创建了动态模型。本质上,我会在数据库中动态创建一个单独的表,然后仅在其中存储一个可视化的数据。我的代码是这样的:

    def get_model_class(table_name):
        class ModelBase(ModelBase):
            def __new__(cls, name, bases, attrs):
                name = '{}_{}'.format(name, table_name)
                return super(ModelBase, cls).__new__(cls, name, bases, attrs)
    
    
        class Data(models.Model):
            # fields here
            __metaclass__ = ModelBase
            class Meta(object):
                db_table = table_name
    
        return Data
    
    dynamic_model = get_model_class('foo')
    

    这对我的目的很有用,因为它允许查询更快,但回到你的问题我认为这样的事情可能很有用,因为这将确保每个客户的数据不仅通过外键分开,而且实际上是在db中分离的。

    使用此方法非常简单,除了在使用模型之前,您必须调用该函数来为每个客户端获取它。为了提高效率,您可以缓存/记忆函数调用的结果,这样它就不必多次重新计算同一事物。

    【讨论】:

    • 只是检查:您的建议是为每个客户端创建一个 twig 表,对于分支、主干等也是如此,然后通过上述代码选择要动态访问的表?我没听错吗?
    • 是的。为每个客户准备一张不同的桌子。不确定它是否适合您的情况,但只是一个。
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2011-01-22
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多