【发布时间】:2021-11-16 18:43:36
【问题描述】:
我在 Django 中有一个带有 where 子句的 extra 过滤器,但表名是动态的。
filtered_queryset = queryset.extra(
where=[
f'({table_name}.modified_on, {table_name}.id) > (%s, %s)',
],
params=(after_ts, after_id),
)
我怎样才能最好地避免 f-string 以确保它不对 SQL 注入开放?
我希望 SQL 具有元组比较,而不是多个 > 和 >= 与 AND。从之前的测试来看,它似乎更有可能使用多列索引。
(这是一些自定义分页代码的一部分,其中光标本质上是一个日期时间和 id 的元组)
【问题讨论】:
-
根据文档,extra 已被弃用,他们希望在需要的情况下获得反馈:docs.djangoproject.com/en/3.2/ref/models/querysets/#extra
-
当然,您始终可以通过拥有有效表名列表并在其中查找表名来自行解决,但您可能不想这样做
标签: python sql django postgresql sql-injection