Python MySQLdb意外行为(?)

时间:2016-10-23 21:45:07

标签: python mysql sql sql-injection

我想确保无法进行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-方案:

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);

1 个答案:

答案 0 :(得分:0)

您是否尝试过执行" cur.execute(sql,(field,name,))" ?