简体   繁体   English

保护节点+ Postgres +护照

[英]Securing Node + Postgres + Passport

I'm currently learning node, postgres, and passport but I am not sure on how to secure my application and best practices. 我目前正在学习节点,postgres和通行证,但不确定如何保护我的应用程序和最佳实践。 I'm not sure on how to sanitize data from client and server or if it's needed but I've parameterized my queries. 我不确定如何清理来自客户端和服务器的数据,或者是否需要清除数据,但是我已经对查询进行了参数化。 Any help would be greatly appreciated! 任何帮助将不胜感激! Apologies for my newbieness. 对我的新手表示歉意。

 var express = require('express'); var helmet = require('helmet') var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); var expressSession = require('express-session'); var passport = require('passport'); var passportLocal = require('passport-local'); var pg = require ('pg'); var bcrypt = require('bcryptjs'); var app = express(); app.use(helmet()); var server = require('http').createServer(app); var io = require('socket.io')(server); var config = { user: 'REDACTED', database: 'REDACTED', password: 'REDACTED', host: 'REDACTED', port: 5432, max: 10, idleTimeoutMillis: 30000, }; var pool = new pg.Pool(config); pool.on('error', function (err, client) { console.error('idle client error', err.message, err.stack) }) app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(expressSession( { secret: process.env.SESSION_SECRET || 'secret', resave: false, saveUninitialized: false })); app.use(passport.initialize()); app.use(passport.session()); passport.use(new passportLocal.Strategy(function(username, password, done) { pool.connect(function(poolErr, poolClient, poolDone) { if(poolErr) { return console.error('pool client fetch error', poolErr); } poolClient.query('SELECT id, password FROM users WHERE username = $1', [username], function(queryErr, queryRes) { if(queryErr) { return console.error('query error', queryErr); } if(queryRes.rows[0] != undefined) { bcrypt.compare(password, queryRes.rows[0].password, function(compareErr, compareRes) { if(compareErr) { return console.error('bcrypt error', compareErr); } if(compareRes) { done(null, { id: queryRes.rows[0].id }); } else { done(null, null); } poolDone(); }); } else { //user not found poolDone(); done(null, null); } }); }); })); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { pool.connect(function(err, poolClient, poolDone) { if(err) { return console.error('pool client fetch error', err); } poolClient.query('SELECT * FROM users WHERE id = $1', [id], function(queryErr, queryRes) { if(queryErr) { return console.error('query error', queryErr); } if(queryRes.rows[0] != undefined) { done(null, { id: id, username: queryRes.rows[0].username, firstname: queryRes.rows[0].firstname, lastname: queryRes.rows[0].lastname }); } else { //user not found done(null, null); } poolDone(); }); }); }); app.set('view engine', 'ejs'); app.get('/', function(req, res) { res.render('index', { isAuthenticated: req.isAuthenticated(), user: req.user }) }); app.get('/login', function(req, res) { res.render('login'); }); app.post('/login', passport.authenticate('local'), function(req, res) { res.redirect('/'); }); app.get('/logout', function(req, res) { req.logout(); res.redirect('/'); }); server.listen(8080); console.log('Server is running...'); 

I don't see much problem but here is my 2 cent to improve it. 我没什么大问题,但这是我要改善的2分钱。

Use compression to reduce network size 使用压缩来减小网络大小

app.use(require('compression'));

Use serve-static for static file like images or pdf 将serve-static用于图片或pdf等静态文件

app.use(require('serve-static')('./public'))

Use middleware to control end point that need Authentication like view/edit profile, change password and etc 使用中间件控制需要身份验证的端点,例如查看/编辑配置文件,更改密码等

function authenticated(req, res, next) {
  if (req.isAuthenticated()) next();
  else {
    res.status(401).send('User not authenticated.');
    // or redirect to login
  }
}

app.get('/profile', authenticated, function(req, res) {
  res.render('profile', {
    req.user
  })
})

Include session destroy when logout 注销时包括会话销毁

app.get('/logout', function(req, res) {
  req.session.destroy();
  req.logout();
  res.redirect('/');
});

为了清理查询,您可以使用sequelise之类的ORM

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM