我正在设置一个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,))
答案 0 :(得分:0)
否-无法在MySQLdb中进行准备的语句。在MySQL API binding in _mysql.c中找不到任何mysql_stmt_init()
,mysql_stmt_prepare()
或mysql_stmt_execute()
。
由于某种原因,MySQLdb的作者选择了模拟参数,而不是使用真实的服务器端预处理语句。
为了防止SQL注入,MySQLdb软件包使用Python字符串格式语法。它将动态值插入SQL查询并应用正确的转义,即在引号字符前添加\
,以确保动态值不包含字符串定界符。
请参阅我对How do PyMySQL prevent user from sql injection attack?的回答以进行演示。
但是,如果您需要对数字常量使用动态值,转义将无济于事。