Python MySQL,这是准备好的语句吗?

时间:2018-08-25 05:07:44

标签: python mysql sql security sql-injection

我正在设置一个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 个答案:

答案 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?的回答以进行演示。

但是,如果您需要对数字常量使用动态值,转义将无济于事。