【问题标题】:Secure raw SQL query in Django with psycopg2使用 psycopg2 在 Django 中保护原始 SQL 查询
【发布时间】:2021-01-06 17:01:39
【问题描述】:

我正在使用 django 框架创建一个 Web 应用程序。在其中一个 SQL 查询中,我必须连接多个表并使用用户输入作为“where”子句的一部分来获取结果。由于查询相当复杂,我选择使用原始 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 的所有部分分成标识符和字面量,我也不知道所有列都事先用这种方式写什么。用户可能会选择许多列进行过滤。

如何确保查询安全?

【问题讨论】:

    标签: python sql django security sql-injection


    【解决方案1】:

    首先让用户定义(甚至知道)您的表/列名称似乎并不安全。

    我会创建一些允许值的字典,用户可以通过该映射过滤到您数据库中的实际表(因此用户不知道您的数据库列名)。

    然后,我不会让用户直接编写“>”、“

    所以最终用户会向您的后端发送一个以下过滤器对象:

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

    然后在您的后端将这些值转换为 sql where 子句

    【讨论】:

    • 注明。这与我所做的有些相似。但是你认为这足以防止 SQL 注入吗?
    • 可以,只要你使用‘format’方法而不是插值直接查询字符串。因为用户仍然可以通过“值”参数提供恶意代码
    猜你喜欢
    • 2015-11-21
    • 2012-03-16
    • 2017-04-08
    • 2013-04-17
    • 2018-05-15
    • 2021-04-12
    • 2012-12-06
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多