2016-10-23 3 views
0

SQL 삽입이 가능하지 않도록하고 싶지만이 스 니펫으로 이상한 동작이 발생합니다. 내 사용자 입력은 "필드"와 "이름"에 있습니다. 필자는 "필드"에 유효한 값만 허용하여 주사를 방지하기 위해 잘라 내기를 작성했지만 더 좋은 방법이 있어야합니까?Python MySQLdb 예기치 않은 동작 (?)

또한 첫 번째 쿼리는 예상 결과를 반환하고 두 번째 반환 값 (('Beschreibung',))과 세 번째 값도 예상대로 작동합니다. 왜 그게, # 2에서 내가 뭘 잘못하고 있니? SQL injection을 막기 위해 파이썬에서 다른 권장 방법이 있습니까?

#!/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