2016-10-23 8 views
0

Я хочу, чтобы SQL-инъекция не была возможна, но я испытываю странное поведение с помощью этого фрагмента. Мой пользовательский ввод находится в «поле» и «имя»; Я также написал сокращенный, чтобы разрешить только допустимые значения для «поля», тем самым предотвращая инъекции, но должен быть лучший способ?Python MySQLdb неожиданное поведение (?)

Кроме того, первый запрос возвращает ожидаемые результаты, второй возвращает ((«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-схема:

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),Eingebaut\nDurch varchar(128),Benutzer varchar(128),Notiz varchar(128),Haendler varchar(128)) ENGINE=InnoDB DEFAULT CHARSET=utf8;ALTER TABLE cmdb ADD UNIQUE KEY hostname (Name); 

ответ

0

Вы пытались выполнить "cur.execute (SQL, (поле, имя))"?

+0

Да, это ничего не меняет. – Craig

Смежные вопросы