#python #mysql #sql #sql-injection
#python #mysql #sql #sql-инъекция
Вопрос:
Я хочу убедиться, что SQL-инъекция невозможна, но я испытываю странное поведение с этим фрагментом. Мой пользовательский ввод находится в «поле» и «имя»; я также написал сокращение, чтобы разрешить только допустимые значения для «поля», таким образом предотвращая внедрение, но должен быть лучший способ?
Кроме того, первый запрос возвращает ожидаемые результаты, второй возвращает ((‘Beschreibung’,),) и третий также работает, как ожидалось. Почему это, что я делаю не так в # 2? Есть ли другой, рекомендуемый способ в python предотвратить SQL-инъекцию?
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import MySQLdb
db = MySQLdb.connect(db="cmdb", user="root", passwd="test", host="127.0.0.1")
cur=db.cursor()
field="Beschreibung"
name="testhost"
sql="SELECT %s FROM cmdb WHERE Name="%s"" % (field, name,)
cur.execute(sql)
data=cur.fetchall()
print data
sql='SELECT %s FROM cmdb WHERE Name=%s'
cur.execute(sql, (field,name) )
data=cur.fetchall()
print data
sql='SELECT * FROM cmdb WHERE Name=%s'
cur.execute(sql, (name,) )
data=cur.fetchall()
print data
DB-scheme:
CREATE TABLE cmdb (Name varchar(128),BSI varchar(128),Projekt varchar(128),Typ varchar(128),Beschreibung varchar(128),Betriebssystem varchar(128),Version varchar(128),Level varchar(128),Standort varchar(128),Status varchar(128),HE varchar(128),Position varchar(128),Seite varchar(128),Hersteller varchar(128),Modell varchar(128),CPU varchar(128),NrCPUs varchar(128),CoresjeCPU varchar(128),RAM varchar(128),Festplatten varchar(128),Besonderheiten varchar(128),IPWAN varchar(128),Teilnetz varchar(128),primaryIP varchar(128),weitereIPs varchar(128),NagiosGruppen varchar(128),Dependson varchar(128),Feed varchar(128),Updategruppe varchar(128),NRBuchhaltung varchar(128),IPMI varchar(128),Admin varchar(128),EingebautnDurch varchar(128),Benutzer varchar(128),Notiz varchar(128),Haendler varchar(128)) ENGINE=InnoDB DEFAULT CHARSET=utf8;ALTER TABLE cmdb ADD UNIQUE KEY hostname (Name);
Ответ №1:
Вы пробовали выполнить «cur.execute(sql, (поле, имя,))»?
Комментарии:
1. Да, это ничего не меняет.