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

使用Flask与mysql.connector向MySQL插入表单字符串变量失败的问题排查

问题根源:SQL语句拼接错误 + 潜在SQL注入风险

你的问题出在直接用字符串拼接生成SQL语句,这会引发两个关键问题:

  1. 动态获取的username和password没有被单引号包裹,MySQL会把它们识别为列名而非字符串值,触发语法错误,也就是你遇到的内部服务器错误。
  2. 这种写法存在严重的SQL注入漏洞,恶意用户可以通过输入特殊字符篡改SQL逻辑,比如输入'); DROP TABLE users;--,直接删除你的数据表。

解决方案:使用参数化查询

mysql.connector支持参数化查询,通过占位符(%s)传递变量,它会自动处理字符串转义和引号包裹,既安全又能避免语法错误。修改你的app.py代码如下:

@app.route('/signup', methods=["POST"])
def signup():
    username = request.form["username"]  # request.form获取的本身就是字符串,无需额外转str
    password = request.form["password"]
    cursor = mydb.cursor()
    # 用%s作为占位符,第二个参数传元组形式的变量
    cursor.execute("INSERT INTO users (username, password) VALUES(%s,%s)", (username, password))
    mydb.commit()
    # 可以添加返回提示,提升用户体验
    return "Signup successful!"

为什么硬编码的语句能正常运行?

因为你硬编码的'test','test'手动加上了单引号,符合MySQL字符串值的语法要求;而动态拼接的语句会变成VALUES(xxx, yyy)(xxx和yyy没有引号),MySQL无法识别为合法的字符串值,自然抛出错误。

另外补充一个生产环境必备建议:绝对不要明文存储密码,建议使用werkzeug.security或bcrypt提供的加密函数对密码进行哈希处理后再存储,示例代码如下:

from werkzeug.security import generate_password_hash

# 替换密码处理部分
password_hash = generate_password_hash(request.form["password"])
cursor.execute("INSERT INTO users (username, password) VALUES(%s,%s)", (username, password_hash))

内容的提问来源于stack exchange,提问作者Lukey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:17:38