簡體   English   中英

轉義動態sqlite查詢?

[英]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 都會更改,這意味着我應該手動轉義字符串。 但是,當我搜索每個人都指向執行...

我對生成查詢的方式也不太滿意,所以如果有人對另一種方式有任何想法,那也很棒!

您有兩個選擇:

  1. 切換到使用SQLAlchemy 它將使生成動態 SQL 更加 Pythonic確保正確引用。

  2. 由於您不能對表名和列名使用參數,因此您仍然必須使用字符串格式將這些包含在查詢中。 另一方面,您的應該始終使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM