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

如何修复NodeJS+MySQL登录页面无需输入信息即可登录的问题

解决登录验证失效的问题

你的代码存在几个关键问题导致无需输入信息就能登录,下面一步步修正:

1. 修复SQL查询语句错误

原SQL里username = users.username是把表字段和自身做比较,这个条件永远为真,只要数据库表有数据就会直接跳转。正确写法应该用占位符?绑定传入的参数:

app.post("/", encoder,function(req,res){
  var username = req.body.username;
  var password = req.body.password;
  // 修正SQL语句,用?作为参数占位符匹配传入值
  connection.query("SELECT * FROM users WHERE username = ? AND password = ?",
  [username, password],function(error,results,fields){
    if (error) throw error; // 新增错误捕获
    if (results.length > 0) {
        res.redirect("/welcome");
    } else {
      res.redirect("/");
    }
    res.end();
  })
})

2. 增加输入非空校验

现在即使输入为空仍会执行查询,需要先判断用户名和密码是否为空,为空直接返回登录页:

app.post("/", encoder,function(req,res){
  var username = req.body.username;
  var password = req.body.password;

  // 新增非空校验,为空则跳转回登录页
  if (!username || !password) {
    return res.redirect("/");
  }

  connection.query("SELECT * FROM users WHERE username = ? AND password = ?",
  [username, password],function(error,results,fields){
    if (error) throw error;
    if (results.length > 0) {
        res.redirect("/welcome");
    } else {
      res.redirect("/");
    }
    res.end();
  })
})

3. 关键安全优化:禁止存储明文密码

当前代码直接存明文密码是严重安全隐患,建议用bcrypt做密码哈希存储:

安装bcrypt

npm install bcrypt

注册用户时哈希密码(示例)

const bcrypt = require('bcrypt');
const saltRounds = 10;

// 注册接口示例
app.post("/register", encoder, function(req, res) {
  const username = req.body.username;
  const plainPassword = req.body.password;

  bcrypt.hash(plainPassword, saltRounds, function(err, hash) {
    if (err) throw err;
    // 将哈希后的密码存入数据库
    connection.query("INSERT INTO users (username, password) VALUES (?, ?)",
    [username, hash], function(error, results) {
      if (error) throw error;
      res.redirect("/");
    });
  });
});

登录时验证哈希密码

app.post("/", encoder,function(req,res){
  var username = req.body.username;
  var password = req.body.password;

  if (!username || !password) {
    return res.redirect("/");
  }

  // 先通过用户名查询用户
  connection.query("SELECT * FROM users WHERE username = ?",
  [username],function(error,results,fields){
    if (error) throw error;
    if (results.length === 0) {
      return res.redirect("/"); // 用户不存在
    }
    // 验证密码哈希是否匹配
    bcrypt.compare(password, results[0].password, function(err, isMatch) {
      if (err) throw err;
      isMatch ? res.redirect("/welcome") : res.redirect("/");
      res.end();
    });
  })
})

额外建议

  • 给登录页添加错误提示,比如用户名密码错误时显示对应信息,提升用户体验
  • 使用数据库连接池(mysql.createPool())代替单连接,避免连接耗尽问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:31:13