2016-10-23 29 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