Échappement automatique des paramètres MySQL en python

Résumé

Utilisez l'espace réservé décrit dans Cursor.execute (self, query, args = None) lors de la construction de requêtes à l'aide du module MySQL-python (MySQLdb) de Python.

query -- string, query to execute on server
args -- optional sequence or mapping, parameters to use with query.

Note: If args is a sequence, then %s must be used as the
parameter placeholder in the query. If a mapping is used,
%(key)s must be used as the placeholder.

Table de test

Créez le tableau suivant pour le test.

mysql> select * from testdb.person;
+------+--------+
| id   | name   |
+------+--------+
|    1 | foo    |
|    2 | bar    |
+------+--------+

mauvais exemple

bad.py


import MySQLdb


def select(name):
    connection = MySQLdb.connect(db='testdb', user='testuser')
    cursor = connection.cursor()
    cursor.execute("select * from person where name='%s'" % name)
    print("[query]")
    print(cursor._last_executed)
    print("[result]")
    result = cursor.fetchall()
    for rec in result:
        print(rec)

Si vous faites select (" foo "), il semble que cela fonctionne bien.

[query]
select * from person where name='foo'
[result]
(1L, 'foo')

Mais si vous faites quelque chose comme select (" foo 'ou name = name - ")

[query]
select * from person where name='foo' or name=name-- '
[result]
(1L, 'foo')
(2L, 'bar')

Et l'injection SQL est terminée.

Bon exemple

good.py


import MySQLdb


def select(name):
    connection = MySQLdb.connect(db='testdb', user='testuser')
    cursor = connection.cursor()
    cursor.execute("select * from person where name=%s", name)
    print("[query]")
    print(cursor._last_executed)
    print("[result]")
    result = cursor.fetchall()
    for rec in result:
        print(rec)

J'ai changé uniquement la partie argument de cursor.execute ().

select (" foo ") fonctionne de la même manière que dans l'exemple précédent.

[query]
select * from person where name='foo'
[result]
(1L, 'foo')

Même si vous faites select (" foo'or name = name-- "), il s'échappera correctement.

[query]
select * from person where name='foo\' or name=name-- '
[result]

Les références

http://stackoverflow.com/questions/1947750/does-python-support-mysql-prepared-statements

Recommended Posts

Échappement automatique des paramètres MySQL en python
Jugement d'équivalence d'objet en Python
Implémentation du tri rapide en Python
Manipulation des pixels d'image en Python
Diviser timedelta dans la série Python 2.7
Gestion des fichiers JSON en Python
Implémentation du jeu de vie en Python
Affichage de la forme d'onde audio en Python
La loi des nombres en python
Implémentation du tri original en Python
Brouillage réversible d'entiers en Python
Défis de Coursera Machine Learning en Python: ex5 (ajustement des paramètres de régularisation)
Conversion de la chaîne <-> date (date, datetime) en Python
Vérifiez le comportement du destroyer en Python
Pratique d'utilisation de ceci en Python (mauvais)
Théorie générale de la relativité en Python: Introduction
Arborescence de sortie des fichiers en Python
Afficher une liste d'alphabets en Python 3
Comparaison des modules de conversion japonais en Python3
Résumé de diverses instructions for en Python
Le résultat de l'installation de python sur Anaconda
Modèles Gang of Four (GoF) en Python
Principes de base pour exécuter NoxPlayer en Python
Remplacement en bloc des chaînes dans les tableaux Python
Projet Euler # 16 "Somme des pouvoirs" en Python
Traffic Safety-kun: Reconnaissance des panneaux de signalisation en Python
Résumé des méthodes intégrées, etc. de la liste Python
Utilisation d'opérateurs non logiques de ou en python
À la recherche du FizzBuzz le plus rapide en Python
Exemple pratique d'architecture hexagonale en Python
Projet Euler # 17 "Nombre de caractères" en Python
Equation de mouvement à double pendule en python
Débarrassez-vous des images DICOM en Python
Statut de chaque système de traitement Python en 2020
Projet Euler # 1 "Multiple de 3 et 5" en Python
[Python] Développer les séquences d'échappement dans les documents d'entendre
Quadtree en Python --2
Python en optimisation
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Les bases de Python ①
Bases de python ①
Programmation avec Python
Plink en Python
Constante en Python
Copie de python
FizzBuzz en Python