Django:SQL注入保护经理.py

2024-04-20 09:30:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个经理.py使用.extra()参数执行原始SQL查询的文件。例如:

class MyManager(models.Manager):

    def order_null_last(self, field):
        return super(DecisionManager, self).get_query_set()\
            .extra(select={'has_field': "CASE WHEN " + field + " IS NULL THEN 1 ELSE 0 END"}).order_by('has_field', field)

有人告诉我,这种查询很容易受到注入攻击。在

对变量“field”进行了分析,以确保它属于一组合法值,但此检查是在视图中完成的。例如:

^{pr2}$

因此,如果有人使用上面的管理器编写了一个新视图,但是他们忘记了过滤参数,那么利用漏洞是可能的。在

那么,有没有一种方法可以在不获取循环导入的情况下根据管理器中的模型字段验证参数吗?也就是说,管理器需要导入模型以获取允许字段的列表,但是模型需要导入管理器。在


Tags: 文件py模型self视图field管理器sql
2条回答

模型管理器可以访问模型,因此可以通过自我模型. 在

所以我可以写下:

类MyManager(模特。经理)公司名称:

def order_null_last(self, field):
    if field in [modelfield.name for modelfield in self.model._meta.fields]:
        return super(DecisionManager, self).get_query_set()\
            .extra(select={'has_field': "CASE WHEN " + field + " IS NULL THEN 1 ELSE 0 END"}).order_by('has_field', field)
    else:
        return super(DecisionManager, self).get_query_set()

在extra中使用select_params可避免sql注入:

class MyManager(models.Manager):

def order_null_last(self, field):
    return super(DecisionManager, self).get_query_set()\
        .extra(select={'has_field': "CASE WHEN %s IS NULL THEN 1 ELSE 0 END"}, select_params=(field,)).order_by('has_field', field)

相关问题 更多 >