簡體   English   中英

來自 bcryptjs 的 bcrypt.compare 總是返回 false

[英]bcrypt.compare from bcryptjs always returns 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 注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM