Expressjs - 如何阻止用户发布注册表单......?

时间:2014-06-02 23:56:56

标签: node.js session express

如果用户尝试将POST数据添加到注册表单(如果他们已经登录)或者是否有更好的更安全的方式,则以下是一种重定向用户的适当方法吗?我阻止他们向注册表单发出GET请求,但我也希望阻止他们通过其他方式提出POST请求。

支票是:

if(true !== req.session.loggedIn){

}else{

}

在app.js文件中:

app.get('/register',register.registration);
app.post('/register',register.doRegistration);

这是控制器文件:

var mongoose = require('mongoose');
var User = mongoose.model('User');

exports.registration = function(req,res){

    //Redirect the user if they are logged in 
    if(true !== req.session.loggedIn){

        res.render('register', { 

        });

    }else{

        res.redirect('/user');

    }
}
exports.doRegistration = function(req,res){

    //Redirect the user if they are logged in 
if(true !== req.session.loggedIn){

    User.create({

        fullName: req.body.register.fullName,
        email: req.body.register.email,
        password: req.body.register.password,
        createdOn: Date.now()

    }, function(err, user){

        if(err){

            console.log(err);
            res.redirect('/register');

        }else{

            console.log('success');

            req.session.user = {

                "name": user.fullName,
                "email": user.email,
                "_id": user._id

            };

            req.session.loggedIn = true;
            res.redirect('/user');
        }

    });
}else{

           res.redirect('/user');

 }

  }

1 个答案:

答案 0 :(得分:0)

首先,您可以简单地使用一些中间件来检查用户是否已登录并在其中添加任何逻辑,而不是为每条路径重复自己:

function ensureNewUser(req, res, next) {
    if (req.session.loggedIn) {
        // if user is logged in redirect to /user
        res.redirect('/user');
    } else {
        // else next
        next();
    }
}

然后在路由定义中使用该中间件:

app.get('/register', ensureNewUser, register.registration);
app.post('/register',ensureNewUser, register.doRegistration);

不完全确定“更安全的方式”是什么意思,很难在不知道如何处理身份验证的情况下发表评论,但是“阻止他们做出其他方式的POST请求然后表单”我假设你在谈论CSRF 。在这种情况下,您应确保使用某些CSRF中间件app.use(express.csrf());或使用Express4之类的csurf模块,然后确保从前端发送请求中的令牌