gpt4 book ai didi

python - Odoo E8103 : SQL injection risk. 如果可以,请使用参数

转载 作者:行者123 更新时间:2023-12-04 13:31:25 25 4
gpt4 key购买 nike

我正在使用 odoo pylint 并遇到此消息“Odoo E8103:SQL 注入(inject)风险。如果可以,请使用参数'。它指的是以下示例 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)
并根据 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)
使用 Classic approach因为我在域中使用动态 WHERE 子句并遵循 OCA description , 实现通过 lint 和无错误运行

最佳答案

你已经正确地改变了它。如果您不完全确定其背后的原因,请永远不要忽略该 lint 消息。
OCA description已经有了正确的答案,为什么要避免这样的代码。

Care must be taken not to introduce SQL injections vulnerabilitieswhen using manual SQL queries. The vulnerability is present when userinput is either incorrectly filtered or badly quoted, allowing anattacker to introduce undesirable clauses to a SQL query (such ascircumventing filters or executing UPDATE or DELETE commands).

The best way to be safe is to never, NEVER use Python stringconcatenation (+) or string parameters interpolation (%) to passvariables to a SQL query string.

The second reason, which is almost as important, is that it is the jobof the database abstraction layer (psycopg2) to decide how to formatquery parameters, not your job! For example psycopg2 knows that whenyou pass a list of values it needs to format them as a comma-separatedlist, enclosed in parentheses!


甚至提到了 xkcd 的老漫画“鲍比 table ”;-)

关于python - Odoo E8103 : SQL injection risk. 如果可以,请使用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64869798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com