You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Qt中基于MySQL数据库的登录账号密码验证实现咨询

Qt MySQL 登录验证问题解决办法

嘿,我来帮你搞定这个登录验证的问题!你的思路方向是对的,但代码里有几个小问题需要修正,尤其是安全层面的隐患,咱们一步步来梳理:

先说说原代码里的问题

  • SQL语法错误:你的查询语句里select logins, passwords * from users多了个多余的*,而且where条件里的password和数据库字段名passwords不匹配,这会直接导致查询失败。
  • 严重的安全风险:直接把用户输入的账号密码拼接到SQL语句里,会引发SQL注入攻击——恶意用户可以构造特殊输入篡改数据库、窃取数据,这种写法绝对要避免!

正确的实现方式

咱们用Qt的QSqlQuery参数绑定功能来解决这些问题,既安全又可靠:

void login::on_pushButton_sign_in_clicked()
{
    QString login = ui->lineEdit_login_login->text().trimmed(); // 去除输入前后的空格
    QString password = ui->lineEdit_password_login->text().trimmed();

    // 先检查输入是否为空,提升用户体验
    if (login.isEmpty() || password.isEmpty()) {
        QMessageBox::warning(this, "提示", "请输入完整的账号和密码!");
        return;
    }

    QSqlQuery qry;
    // 准备带占位符的SQL语句,用?作为参数占位符
    if (qry.prepare("SELECT logins, passwords FROM users WHERE logins = ? AND passwords = ?")) {
        // 绑定输入内容到占位符,顺序要和SQL里的?对应
        qry.addBindValue(login);
        qry.addBindValue(password);

        if (qry.exec()) {
            // 如果查询到结果,说明账号密码匹配
            if (qry.next()) {
                hide();
                mainwindow = new MainWindow(this);
                mainwindow->show();
            } else {
                // 无匹配记录,提示账号或密码错误
                QMessageBox::warning(this, "登录失败", "账号或密码不正确,请重新输入!");
            }
        } else {
            // 查询执行失败,输出错误信息方便调试
            qDebug() << "数据库查询失败:" << qry.lastError().text();
            QMessageBox::critical(this, "错误", "数据库查询出错,请检查连接状态!");
        }
    } else {
        // SQL语句准备失败,输出错误
        qDebug() << "SQL语句准备失败:" << qry.lastError().text();
        QMessageBox::critical(this, "错误", "SQL语句格式错误!");
    }
}

额外的优化建议

  • 密码不要明文存储在数据库里,建议用bcrypt、Argon2这类安全的哈希算法加密后再存储,即使数据库泄露,用户密码也不会直接暴露。
  • 可以给登录按钮添加输入限制,比如连续多次失败后锁定账号,提升安全性。

内容的提问来源于stack exchange,提问作者Paweł Zieliński

火山引擎 最新活动