2017-04-12 88 views
1

我的理解是,SQL注入通常是不好的。這很好,正如PEP 249所述,您可以使用佔位符來防止大多數通用注射。然而,我沒有看到如何使涉及LIKE的查詢動態化。使用python 2.7和MySQLdb進行動態LIKE查詢

我的情況具體是我有一個ajax調用是在輸入更改爲名稱字段上運行。結果是我的查詢結果被過濾WHERE table.name LIKE name_var作爲一個簡單的表示。顯然直接在name_var中插入查詢是非常危險的,而且有些人甚至可能會因爲看到這一點而產生一箇中風。但是,我如何使這個安全和動態?我是否構建自己的解析器? MySQLdb是否有一些內置的功能來處理這個問題?我似乎無法找到很有用的信息,所以我會很感激任何幫助。

回答

1

是的MySQLdb可以做到這一點。

sql = """SELECT ... WHERE t.name LIKE %s""" 
cur = cnx.cursor(prepared=True) 
cur.execute(sql, (name_var,)) 

如果你想通配符,所以你可以搜索串,你可以做的是,在SQL表達式:

sql = """SELECT ... WHERE t.name LIKE CONCAT('%', %s, '%')""" 
cur = cnx.cursor(prepared=True) 
cur.execute(sql, (name_var,)) 

或者你可以把它當作一個參數之前,這樣做是爲了在Python變量:

sql = """SELECT ... WHERE t.name LIKE %s""" 
cur = cnx.cursor(prepared=True) 
name_var_with_wildcards = '%{0}%'.format(name_var) 
cur.execute(sql, (name_var_with_wildcards,)) 

如果您name_var可以包含文字LIKE通配符%_,你需要轉義:

sql = """SELECT ... WHERE t.name LIKE CONCAT('%', %s, '%')""" 
cur = cnx.cursor(prepared=True) 
name_var_escaped = re.sub(r'([_%])', r'\\\1', name_var) 
cur.execute(sql, (name_var_escaped,)) 
+0

哦真棒,我想我可以做一些這種效果,但沒有運氣。我會把這隻兔子全部下來,看看它是從哪裏來的。謝謝! – Turk