mysql,这是一个准备好的语句吗?

jv4diomz  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(384)

我正在安装一个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,))
zvokhttg

zvokhttg1#

不-没有办法在mysqldb中做一个准备好的语句。你找不到了 mysql_stmt_init() , mysql_stmt_prepare() 或者 mysql_stmt_execute() 在mysql.c的mysql api绑定中。
不管出于什么原因,mysqldb的作者选择了模拟参数,而不是使用真正的服务器端准备语句。
为了防止sql注入,mysqldb包使用python字符串格式语法。它将动态值插入到sql查询中,并应用正确的转义,即添加 \ 在引用字符之前,请确保动态值不包含字符串分隔符。
看看我对pymysql如何防止用户遭受sql注入攻击的回答?做个示范。
但是,如果需要对数值常量使用动态值,则转义没有帮助。

相关问题