如何修复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
相关产品推荐
相关产品推荐

