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

Flask WTForms提交按钮遭ZAP检测出SQL注入漏洞,求修复方案

攻击原理分析

ZAP检测到的SQL注入风险,核心原因是后端代码错误地将提交按钮(submit)的字符串值直接拼接到了SQL查询语句中。

正常情况下,Flask WTForms的SubmitField仅用于判断表单是否被提交(通过form.validate_on_submit()),其前端传递的value(即你定义的'Log In')本不该参与数据库查询。但如果后端存在类似以下错误逻辑:

# 错误示例:误用submit的value拼接SQL
submit_value = request.form.get('submit')
query = f"SELECT * FROM users WHERE submit = '{submit_value}'"

攻击者构造的Log In' OR '1'='1' --会被拼入SQL,最终语句变成:

SELECT * FROM users WHERE submit = 'Log In' OR '1'='1' --'

其中--会注释掉后续语句,OR '1'='1'让查询条件永远为真,导致返回结果集与正常请求不同,ZAP通过对比结果变化判定存在SQL注入漏洞。

安全加固方案

1. 停止误用SubmitField的value参与数据库操作

SubmitField的唯一作用是判断表单提交状态,后端只需通过form.validate_on_submit()确认表单已提交,绝对不要提取它的value值用于SQL查询或其他数据库操作。

2. 强制使用参数化查询/ORM

所有数据库操作必须使用参数化查询(如SQLAlchemy的ORM接口、cursor.execute带占位符的写法),彻底避免手动拼接SQL:

# 正确示例:用SQLAlchemy ORM处理登录逻辑
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import check_password_hash

db = SQLAlchemy(app)
class User(db.Model):
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        # ORM自动处理参数化,避免SQL注入
        user = User.query.filter_by(username=form.username.data).first()
        if user and check_password_hash(user.password, form.password.data):
            # 执行登录逻辑
            return redirect(url_for('index'))
        flash('用户名或密码错误')
    return render_template('login.html', form=form)

3. 过滤异常的submit参数值(可选)

如果因特殊需求必须处理submit参数,可在后端验证其值是否为预期的'Log In',不符合则直接拒绝请求:

@app.route('/login', methods=['POST'])
def login():
    submit_value = request.form.get('submit')
    if submit_value != 'Log In':
        abort(400, description='非法请求参数')
    # 后续表单验证与业务逻辑

4. 无需为SubmitField添加验证器

你遇到的TypeError是因为WTForms的SubmitField本质是布尔类型字段,针对字符串的验证器(如DataRequired)不适用于它,完全没必要给SubmitField添加验证器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:10:17