2017-04-12 12 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 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) 
cur.execute(sql, (name_var,)) 

、あなたはSQL式でそれを行うことができます。

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

関連する問題