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)
你已经正确地改变了它。如果您不完全确定其背后的原因,请永远不要忽略该 lint 消息。
OCA的描述已经有正确的答案,为什么要避免这样的代码。
使用手动 SQL 查询时必须注意不要引入 SQL 注入漏洞。当用户输入被错误过滤或错误引用时,就会出现该漏洞,从而允许攻击者在 SQL 查询中引入不需要的子句(例如规避过滤器或执行 UPDATE 或 DELETE 命令)。
确保安全的最佳方法是永远不要使用 Python 字符串连接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串。
第二个原因几乎同样重要,是数据库抽象层 (psycopg2) 的工作是决定如何格式化查询参数,而不是您的工作!例如,psycopg2 知道,当您传递值列表时,它需要将它们格式化为逗号分隔的列表,并用括号括起来!
甚至还提到了 xkcd 的好老漫画“Bobby table”;-)
| 归档时间: |
|
| 查看次数: |
1187 次 |
| 最近记录: |