Flask操作MySQL写入bcrypt哈希密码报1064语法错误如何解决?
问题根因分析
- 使用Python字符串格式化直接拼接SQL语句,未处理特殊字符:bcrypt生成的哈希值自带单引号会破坏SQL语句的引号闭合逻辑,直接触发语法错误,同时该写法存在严重SQL注入风险。
- 类型转换错误:
bcrypt.hashpw返回结果为bytes类型,直接调用str()转换会生成带b'前缀的字符串,其中的单引号刚好打断SQL语法结构,就是你报错信息中指向的错误位置。
修复方案
- 替换字符串拼接SQL的写法,改用MySQL官方驱动提供的参数化查询能力,驱动会自动完成特殊字符转义,同时规避SQL注入风险。
- 修正哈希值的类型转换逻辑,用
decode('utf-8')把bytes类型的哈希转成纯字符串,去掉多余的b'前缀。
修改后的核心代码如下:
# 原哈希生成行加decode转成正常字符串 HASHEDPASS = bcrypt.hashpw(PASSWORD.encode('utf-8'), bcrypt.gensalt()).decode('utf-8') # 改用参数化查询,占位符用%s,参数以元组形式传入,不需要手动加引号 mycursor.execute("insert into hassle_free_register(USERNAME,PASSWORD) values(%s, %s)", (NAME, HASHEDPASS))
验证方法
- 重新发起注册请求,确认1064语法错误不再抛出
- 查看数据库中存储的PASSWORD字段值,应为
$2b$开头的标准bcrypt哈希字符串,无多余前缀 - 登录验证时,将数据库存储的哈希字符串转成bytes类型后,调用
bcrypt.checkpw即可正常校验密码正确性
内容的提问来源于stack exchange,提问作者Girik Nohani
相关产品推荐
相关产品推荐

