2017-04-12 5 views
1

Je crois comprendre que l'injection SQL est, en général, mauvaise. Et c'est très bien, comme décrit dans PEP 249, vous pouvez utiliser des espaces réservés pour protéger contre la plupart des injections génériques. Cependant, je ne vois rien qui parle de comment faire des requêtes impliquant LIKE dynamique.Requêtes LIKE dynamiques avec python 2.7 et MySQLdb

Ma situation spécifique est que j'ai un appel ajax qui a couru sur le changement d'entrée à un champ de nom. Le résultat étant mes résultats de requête sont filtrés WHERE table.name LIKE name_var comme une représentation simple. Évidemment, il est horriblement dangereux d'insérer directement le nom_var dans la requête, et certains d'entre vous ont peut-être même eu un petit coup en voyant cela. Mais comment puis-je rendre cela sûr et dynamique? Est-ce que je construis mon propre analyseur? Est-ce que MySQLdb a des fonctionnalités intégrées pour gérer cela? Je n'arrive pas à trouver beaucoup d'informations utiles donc j'apprécierais toute aide.

Répondre

1

Oui MySQLdb peut le faire.

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

Si vous voulez des jokers que vous pouvez rechercher des sous-chaînes, vous pouvez le faire dans l'expression SQL:

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

Ou vous pouvez le faire à la variable Python avant de le transmettre comme paramètre:

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,)) 

Si votre name_var peut contenir littéralement les jokers % et _, vous devez leur échapper:

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

Oh génial, j'ai pensé que je pouvais faire quelque chose à cet effet, mais je n'avais pas de chance. Je vais plonger ce lapin entier et voir où ça me mène. Merci! – Turk