Verwenden Sie den in Cursor.execute (self, query, args = None)
beschriebenen Platzhalter, wenn Sie Abfragen mit dem MySQL-Python-Modul (MySQLdb) von Python erstellen.
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.
Erstellen Sie die folgende Tabelle zum Testen.
mysql> select * from testdb.person;
+------+--------+
| id | name |
+------+--------+
| 1 | foo |
| 2 | bar |
+------+--------+
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)
Wenn Sie select (" foo ")
auswählen, sieht es so aus, als würde es gut funktionieren.
[query]
select * from person where name='foo'
[result]
(1L, 'foo')
Aber wenn Sie so etwas wie "select" ("foo" oder name = name - ")" tun
[query]
select * from person where name='foo' or name=name-- '
[result]
(1L, 'foo')
(2L, 'bar')
Und die SQL-Injection ist fertig.
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)
Ich habe nur den Argumentteil von cursor.execute ()
geändert.
select (" foo ")
funktioniert genauso wie im vorherigen Beispiel.
[query]
select * from person where name='foo'
[result]
(1L, 'foo')
Selbst wenn Sie "select" ("foo'or name = name--") "auswählen, wird es ordnungsgemäß ausgeblendet.
[query]
select * from person where name='foo\' or name=name-- '
[result]
http://stackoverflow.com/questions/1947750/does-python-support-mysql-prepared-statements
Recommended Posts