Django 中用户定义的 postgres jsonb 查询的安全问题

Security concerns with user defined postgres jsonb queries in Django

我们在 Django 中有一个 postgres jsonb 字段,允许用户存储任意用户数据。我们希望允许用户查询此字段,但不确定安全隐患

模特

from django.db import models

class Item(models.Model):
    user = models.ForeignKey("user", null=False)
    meta = JSONField()

查询

def custom_query(operation, value):
    qs = Item.objects.filter(user=user)

    params = {
        "meta__" + operation: value
    }

    qs = qs.filter(**params)

用法:

假设 meta{"a": 1}

custom_query(operation="contains", value={"a": 1})
custom_query(operation="a", value=1)

以上应该是有效且等效的查询。

这是执行查询的安全方法吗?

我建议为有效的 operation 添加一个白名单,并且可能检查 value 是适当简单的(例如,仅字符串),但在存在其他过滤器的情况下确保可以选择的行是用户可以看到的行,我认为这没有问题。