【问题标题】:How can I uppercase a hashed md5 in my query?如何在查询中将散列 md5 大写?
【发布时间】:2017-07-15 13:56:33
【问题描述】:

如何在一个散列 md5 进入数据库之前将其大写?

我尝试了以下方法:

connection.query("UPDATE penguins SET password = UPPER(password)");

这可行,但它不会将刚刚注册的用户大写。它在数据库中每隔一个 md5 哈希就大写。

这是我的 INSERT 查询:

var insertQuery = "INSERT INTO penguins (moderator, registrationdate, inventory, email, password, username, nickname ) VALUES ('" + moderator + "','" + registrationdate + "','" + inventory + "','" + email +  "', + MD5('" + password + "'), '" + username + "', '"+username+"')";

这是我的整个护照策略:

var moment = require('moment');
var datetime = moment().format('x')
var mysql = require('mysql');
var LocalStrategy = require('passport-local').Strategy;

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'root'
});

connection.query('USE kitsune');

// expose this function to our app using module.exports
module.exports = function(passport) {

    // =========================================================================
    // passport session setup ==================================================
    // =========================================================================
    // required for persistent login sessions
    // passport needs ability to serialize and unserialize users out of session

    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        connection.query("SELECT * FROM penguins WHERE id = " + id, function(err, rows) {
            done(err, rows[0]);
        });
    });


    // =========================================================================
    // LOCAL SIGNUP ============================================================
    // =========================================================================
    // we are using named strategies since we have one for login and one for signup
    // by default, if there was no name, it would just be called 'local'

       passport.use('local-signup', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField: 'username',
        passwordField: 'password',
        gameusernameField: 'username',
        nicknameField: 'nickname',
        passReqToCallback: true // allows us to pass back the entire request to the callback
    },

    function(req, username, password, done) {

        // here you read from req
        const email = req.body.email
        const nickname = req.body.nickname
        const inventory = '%1'; // This is what the user gets on register. You can set this to anything that you want like: %1%2%3%4%5%6%7%8%9%10%11%12%13%14%15%16
        const moderator = '0';
        const registrationdate = datetime

    passport.serializeUser(function(username, done) {
        done(null, username);
    });

        // find a user whose email is the same as the forms email
        // we are checking to see if the user trying to login already exists
        connection.query("SELECT * FROM `penguins` WHERE `username` = '" + username + "'", function(err, rows) {
            console.log(rows);
            console.log("above row object");
            if (err) return done(err);
            if (rows.length) {
                return done(null, false, req.flash('signupMessage', 'That username is already taken.'));
            } else {

                // if there is no user with that email
                // create the user
                var newUserMysql = new Object();
                newUserMysql.registrationdate = registrationdate;
                newUserMysql.moderator = moderator;
                newUserMysql.inventory = inventory;
                newUserMysql.email = email;
                newUserMysql.password = password; // use the generateHash function in our user model
                newUserMysql.username = username;
                newUserMysql.nickname = nickname;
                var insertQuery = "INSERT INTO penguins (moderator, registrationdate, inventory, email, password, username, nickname ) VALUES ('" + moderator + "','" + registrationdate + "','" + inventory + "','" + email +  "', + MD5('" + password + "'), '" + username + "', '"+username+"')";
                console.log(insertQuery);
                console.log('Query is rolling!');
                connection.query(insertQuery, function(err, rows) {
                    newUserMysql.id = rows.insertId;
                    return done(null, newUserMysql);
                    });

            }
        });

    }));





    // =========================================================================
    // LOCAL LOGIN =============================================================
    // =========================================================================
    // we are using named strategies since we have one for login and one for signup
    // by default, if there was no name, it would just be called 'local'

    passport.use('local-login', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField: 'email',
        passwordField: 'password',
        passReqToCallback: true // allows us to pass back the entire request to the callback
    },

    function(req, email, password, username, nickname, done) { // callback with email and password from our form
        connection.query("SELECT * FROM `penguins` WHERE `username` = '" + username + "'", function(err, rows) {
            if (err) return done(err);
            if (!rows.length) {
                return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash
            }

            // if the user is found but the password is wrong
            if (!(rows[0].password == password)) return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata

            // all is well, return successful user
            return done(null, rows[0]);

        });



    }));

};

【问题讨论】:

    标签: sql node.js passport.js md5


    【解决方案1】:

    您是否在插入语句中尝试过 UPPER(),希望这可能有效。

        var insertQuery = "INSERT INTO penguins (moderator, registrationdate, inventory, email, password, username, nickname ) VALUES ('" + moderator + "',UNIX_TIMESTAMP(),'" + inventory + "','" + email +  "', + UPPER(MD5('" + password + "')), '" + username + "', '"+username+"')";
    

    【讨论】:

    • 这成功了!太感谢了!您是否还知道:此处的注册日期设置正确等?
    • 您的问题对于注册日期不清楚,如果您想在插入查询中设置注册日期,您可以使用 NOW()、CURDATE() 中的任何一个。如果这不是您的问题,请告诉我更多信息。
    • 它需要在 UNIX 时间,但它没有在数据库中更新自己
    • 我尝试了类似 const dateTime = new Date().getTime();常量时间戳 = Math.floor(dateTime / 1000);常量注册日期 = 时间戳 newUserMysql.registrationdate = 注册日期;这可行,但它不会更新时间,并且插入的时间始终相同。
    • 我相信 UNIX_TIMESTAMP() 会帮助我,如何将它添加到我的查询中?
    猜你喜欢
    • 2023-04-09
    • 2011-12-13
    • 2015-05-03
    • 2019-06-22
    • 2023-03-24
    • 2012-06-17
    • 2014-11-18
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多