如何解决来自 bcryptjs 的 bcrypt.compare 总是返回 false
我在 React 和 Node js 项目上使用 bcryptjs,但似乎无法让它返回 true。在所有在线验证器上,它使用密码和哈希返回为有效。我已经验证了长度是正确的,但无法让它工作。
我的 HandleSubmit 函数:
event.preventDefault();
const self = this;
const data = `username=${encodeURIComponent(this.state['username'])}&`;
axios.post(`/test/do_login/${data}`)
.then(function (response) {
console.log("RESPONSE");
console.log(response);
bcrypt.compare(self.state.password,response.data).then(function (result) {
console.log(`PW: ${self.state.password}\nDATA:${response.data}\nRES:${result}`);
if (result) self.setState({ loginSuccess: true });
});
});
}
在服务器上:
const express = require('express');
const bcrypt = require('bcryptjs');
const router = express.Router();
const regexp = /=(.+?)&/g
router.post('/do_login/:data',(req,res) => {
var con = req.app.get('con');
var args = [...(req.params.data).matchAll(regexp)];
console.log(args);
var username = args[0][1];
query = `SELECT * FROM users WHERE username="${username}";`
con.query(query,(err,result) => {
if (err) throw err;
console.log(result);
if (result.length < 1) res.send("USERNAME_INV")
else {
res.send(String(result[0].pw).slice(0,59));
};
});
});
module.exports = router;
我正在使用 slice 删除数据库条目末尾的 \u000。它存储在一个 BINARY(60)
解决方法
我认为您试图以错误的方式解决此问题。
在您的 React 应用程序中,只需将带有正文负载(用户名和密码)的请求发布到您的服务器。而已。不要将凭据作为查询参数发送,这是不安全的。
在您的 nodejs 应用程序中,您必须处理此调用:
- 与将是散列的密码(来自您的身体)和存储在您的数据库中的密码(也经过散列)进行比较
- 将 cookie 或 access_token 发送到您的 React 应用程序,每次您为下一个请求调用服务器时都会发送这些信息。您必须创建一个中间件来检查 cookie 或 access_token。
此外,请检查您的用户名字段以避免 sql 注入。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。