Python MySQLdb 意外行为(?)
Posted
技术标签:
【中文标题】Python MySQLdb 意外行为(?)【英文标题】:Python MySQLdb unexpected behaviour (?) 【发布时间】:2017-03-05 14:56:45 【问题描述】:我想确保 SQL 注入是不可能的,但我遇到了这个 sn-p 的奇怪行为。我的用户输入在“字段”和“名称”中;我还写了一个片段,只允许“字段”的有效值,从而防止注入,但应该有更好的方法吗?
此外,第一个查询返回预期结果,第二个返回 (('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
数据库方案:
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】:你试过执行“cur.execute(sql, (field,name,))”吗?
【讨论】:
是的,这不会改变任何事情。以上是关于Python MySQLdb 意外行为(?)的主要内容,如果未能解决你的问题,请参考以下文章
Python - 数组复制/分配,numpy的意外'=array [:]'行为
macos 中目录重命名的意外行为(其他 posix 风格?)
Python 32 位在 OS X Lion 上找不到 MySQLdb 模块