默认安全的django ORM层---怎么样?

时间:2013-02-17 04:28:09

标签: django security defensive-programming

我正在运行一个Django商店,我们为每个客户提供一个对象图,该图与所有其他客户的图完全分开。数据是中等敏感的,因此我不希望任何数据从一个客户端泄漏到另一个客户端,也不希望一个客户端删除或更改另一个客户端的数据。

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

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

有什么方法可以解决我自己的遗忘问题?我怎么做这个我不必考虑的事情?

2 个答案:

答案 0 :(得分:0)

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

  • 在我的抽象基类上将默认对象管理器设置为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。我不喜欢: - \

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

答案 1 :(得分:0)

我解释了我遇到的另一个问题,但我认为可能需要考虑解决方案。

我正在开发一个项目来可视化数据,我需要有一个非常大的表来存储所有可视化的所有数据。结果证明这是一个很大的问题,因为我必须做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中分开的。

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