[英]Escaping dynamic sqlite query?
我目前正在根據用戶的輸入構建 SQL 查詢。 可以在此處查看如何完成此操作的示例:
def generate_conditions(table_name,nameValues):
sql = u""
for field in nameValues:
sql += u" AND {0}.{1}='{2}'".format(table_name,field,nameValues[field])
return sql
search_query = u"SELECT * FROM Enheter e LEFT OUTER JOIN Handelser h ON e.Id == h.Enhet WHERE 1=1"
if "Enhet" in args:
search_query += generate_conditions("e",args["Enhet"])
c.execute(search_query)
由於每次我無法在執行調用中插入值時 SQL 都會更改,這意味着我應該手動轉義字符串。 但是,當我搜索每個人都指向執行...
我對生成查詢的方式也不太滿意,所以如果有人對另一種方式有任何想法,那也很棒!
您有兩個選擇:
切換到使用SQLAlchemy ; 它將使生成動態 SQL 更加 Pythonic並確保正確引用。
由於您不能對表名和列名使用參數,因此您仍然必須使用字符串格式將這些包含在查詢中。 另一方面,您的值應該始終使用 SQL 參數,前提是數據庫可以准備語句。
這是不可取的,直接從用戶的輸入采取公正插值表和列名,這是太容易注入任意SQL語句的方式。 對照您接受的此類名稱列表驗證表和列名稱。
因此,以您的示例為基礎,我將朝這個方向發展:
tables = { 'e': ('unit1', 'unit2', ...), # tablename: tuple of column names } def generate_conditions(table_name, nameValues): if table_name not in tables: raise ValueError('No such table %r' % table_name) sql = u"" params = [] for field in nameValues: if field not in tables[table_name]: raise ValueError('No such column %r' % field) sql += u" AND {0}.{1}=?".format(table_name, field) params.append(nameValues[field]) return sql, params search_query = u"SELECT * FROM Enheter e LEFT OUTER JOIN Handelser h ON e.Id == h.Enhet WHERE 1=1" search_params = [] if "Enhet" in args: sql, params = generate_conditions("e",args["Enhet"]) search_query += sql search_params.extend(params) c.execute(search_query, search_params)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.