我正在安装一个mysql应用程序。这是我的getusername方法,使用标准mysqldb格式连接。这是否意味着这是一份事先准备好的声明?另外,这段代码是安全的,还是易受sql注入攻击?
def selectUser(userName):
try:
username = pickle.loads(base64.decode(userName))
except:
username = "admin"
query = "SELECT name FROM users WHERE name = '%s'"
conn = MySQLdb.connect('localhost', 'dbAdmin', 'lja8j30lJJal##', 'blog');
with conn:
c = conn.cursor()
c.execute(query, (username,))
1条答案
按热度按时间zvokhttg1#
不-没有办法在mysqldb中做一个准备好的语句。你找不到了
mysql_stmt_init()
,mysql_stmt_prepare()
或者mysql_stmt_execute()
在mysql.c的mysql api绑定中。不管出于什么原因,mysqldb的作者选择了模拟参数,而不是使用真正的服务器端准备语句。
为了防止sql注入,mysqldb包使用python字符串格式语法。它将动态值插入到sql查询中,并应用正确的转义,即添加
\
在引用字符之前,请确保动态值不包含字符串分隔符。看看我对pymysql如何防止用户遭受sql注入攻击的回答?做个示范。
但是,如果需要对数值常量使用动态值,则转义没有帮助。