使用psycopg2保护Django中的原始SQL查询



我正在使用django框架创建一个web应用程序。在其中一个SQL查询中,我必须连接多个表,并使用用户输入作为"查询"的一部分;其中";子句来获取结果。由于查询相当复杂,我选择使用原始SQL而不是django框架。

查询的简化形式是:

select * from table where {where_clause}

where_clause可以是col1>100 and col2>50 and col3 <40的形式,依此类推这个部分是根据用户输入在前端创建的(有点像股票筛选器(。

为了使查询不受SQL注入的影响,我决定使用psycopg2,它将查询构建为:

query = sql.SQL("select {field} from {table} where {pkey} = %s").format(
field=sql.Identifier('my_name'),
table=sql.Identifier('some_table'),
pkey=sql.Identifier('id'))

即使我将where_clause的所有部分分为标识符和文字,我也不知道用这种方式预先要写的所有列是什么。用户可能会选择许多列进行筛选。

如何确保查询安全?

让用户定义(甚至知道(表/列名一开始似乎并不安全。

我会创建一些允许值的dict,用户可以通过映射到数据库中的实际表来过滤(这样用户就不知道数据库的列名(。

然后,不让用户写">"<'etc运算符我会直接为用户提供一个下拉的比较运算符来使用。

因此,最终用户会向您的后端发送一个followind过滤器对象:

{
“Field name 1”: {“value”: “some value”, “comparison_operator”: “greater_than”,
“Filed name 2”: ...
}

然后在后端将这些值转换为sqlwhere子句

相关内容

  • 没有找到相关文章