Odoo E8103:SQL 注入风险。如果可以的话使用参数

ple*_*xus 5 python sql odoo odoo-12

我正在使用 odoo pylint 并遇到此消息“Odoo E8103:SQL 注入风险”。如果可以的话使用参数'。它指的是以下示例 SQL 查询行模式:

 self.env.cr.execute("""SELECT sq_qty , prod_id ...
        FROM st
        LEFT JOIN prod
        ON prod.id = st.prod_id
        WHERE %s
        GROUP BY prod_id, loc_id, ..."""% domain, args)
Run Code Online (Sandbox Code Playgroud)

根据OCA No SQL Injection,最好的安全方法是永远不要使用 Python 字符串连接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串。

我尝试将 '%' 替换为 ',' 并用 () 括起域和参数: GROUP BY prod_id, loc_id, ...""", (domain, args)),它通过了检查,但不确定这是否是正确的方法。

放置跳过检查是更好还是按照 pylint 建议的内容进行修改,如果修改更好,处理它的正确方法是什么?

编辑:我将sql查询语句分离为变量

query = """SELECT sq_qty , prod_id ...
        FROM st
        LEFT JOIN prod
        ON prod.id = st.prod_id
        WHERE """
query += domain + """ GROUP BY prod_id, loc_id, ..."""
self.env.cr.execute(query, args)
Run Code Online (Sandbox Code Playgroud)

使用经典方法,因为我使用带有域的动态 WHERE 子句并遵循OCA 描述,实现了传递 lint 和无错误运行

CZo*_*ner 2

你已经正确地改变了它。如果您不完全确定其背后的原因,请永远不要忽略该 lint 消息。

OCA的描述已经有正确的答案,为什么要避免这样的代码。

使用手动 SQL 查询时必须注意不要引入 SQL 注入漏洞。当用户输入被错误过滤或错误引用时,就会出现该漏洞,从而允许攻击者在 SQL 查询中引入不需要的子句(例如规避过滤器或执行 UPDATE 或 DELETE 命令)。

确保安全的最佳方法是永远不要使用 Python 字符串连接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串。

第二个原因几乎同样重要,是数据库抽象层 (psycopg2) 的工作是决定如何格式化查询参数,而不是您的工作!例如,psycopg2 知道,当您传递值列表时,它需要将它们格式化为逗号分隔的列表,并用括号括起来!

甚至还提到了 xkcd 的好老漫画“Bobby table”;-)