You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask操作MySQL写入bcrypt哈希密码报1064语法错误如何解决?

问题根因分析
  • 使用Python字符串格式化直接拼接SQL语句,未处理特殊字符:bcrypt生成的哈希值自带单引号会破坏SQL语句的引号闭合逻辑,直接触发语法错误,同时该写法存在严重SQL注入风险。
  • 类型转换错误:bcrypt.hashpw返回结果为bytes类型,直接调用str()转换会生成带b'前缀的字符串,其中的单引号刚好打断SQL语法结构,就是你报错信息中指向的错误位置。
修复方案
  1. 替换字符串拼接SQL的写法,改用MySQL官方驱动提供的参数化查询能力,驱动会自动完成特殊字符转义,同时规避SQL注入风险。
  2. 修正哈希值的类型转换逻辑,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:54:03