Node.js 安全节点+Postgres+Passport

Node.js 安全节点+Postgres+Passport,node.js,postgresql,security,passport.js,Node.js,Postgresql,Security,Passport.js,我目前正在学习node、postgres和passport,但我不确定如何保护我的应用程序和最佳实践。我不确定如何清理来自客户端和服务器的数据,或者是否需要这些数据,但我已经参数化了我的查询。任何帮助都将不胜感激!为我的新人道歉 var express=需要“express”; var头盔=需要“头盔” var bodyParser=需要“body-parser”; var cookieParser=需要“cookie-parser”; var expressSession=需要“快速会话”;

我目前正在学习node、postgres和passport,但我不确定如何保护我的应用程序和最佳实践。我不确定如何清理来自客户端和服务器的数据,或者是否需要这些数据,但我已经参数化了我的查询。任何帮助都将不胜感激!为我的新人道歉

var express=需要“express”; var头盔=需要“头盔” var bodyParser=需要“body-parser”; var cookieParser=需要“cookie-parser”; var expressSession=需要“快速会话”; var passport=需要“passport”; var passportLocal=需要“passport-local”; var pg=要求“pg”; var bcrypt=需要“bcryptjs”; var-app=express; app.usehamet; var server=require'http'。createServerapp; var io=require'socket.io'服务器; 变量配置={ 用户:“已编辑”, 数据库:“已编辑”, 密码:“已编辑”, 主持人:"编辑",, 港口:5432, 最高:10, idleTimeoutMillis:30000, }; 变量池=新的pg.Poolconfig; 在'error'上,函数err,客户端{ console.error'idle client error',err.message,err.stack } app.usebodyParser.urlencoded{extended:false}; app.usecookieParser; app.useexpressSession{ 秘密:process.env.SESSION|u secret | |“secret”, resave:false, saveUninitialized:false }; app.usepassport.initialize; app.usepassport.session; passport.usenew passportLocal.StrategyFunction用户名、密码、完成{ pool.connectfunctionpoolErr、poolClient、poolDone{ 伊夫普尔{ 返回控制台。错误'pool client fetch error',poolErr; } 查询'SELECT id,username=$1'用户的密码,[username],functionqueryer,queryRes{ 伊夫奎耶尔{ 返回控制台。错误'queryerror',queryer; } ifqueryRes.rows[0]!=未定义 { bcrypt.comparepassword,queryRes.rows[0]。密码,函数compareerr,compareers{ IfCompareer{ 返回控制台。错误'bcrypt error',compareErr; } 如果比较{ donenull,{id:queryRes.rows[0].id}; }否则{ donenull,空; } 普尔顿; }; }否则{ //找不到用户 普尔顿; donenull,空; } }; }; }; passport.serializeUserfunctionuser,完成{ donenull,user.id; }; passport.deserializeUserfunctionid,完成{ pool.ConnectFunctionError、poolClient、poolDone{ 伊弗{ 返回控制台。错误'pool client fetch error',err; } 查询'SELECT*FROM users,其中id=$1',[id],functionqueryer,queryRes{ 伊夫奎耶尔{ 返回控制台。错误'queryerror',queryer; } ifqueryRes.rows[0]!=未定义 { donenull,{id:id,用户名:queryRes.rows[0]。用户名,firstname:queryRes.rows[0]。firstname,lastname:queryRes.rows[0]。lastname}; }否则{ //找不到用户 donenull,空; } 普尔顿; }; }; }; 应用程序设置“查看引擎”、“ejs”; app.get'/',functionreq,res{ res.render'index'{ isAuthenticated:req.isAuthenticated, 用户:req.user } }; app.get'/login',functionreq,res{ res.render'login'; }; app.post'/login',passport.authenticate'local',functionreq,res{ res.重定向“/”; }; app.get'/logout',functionreq,res{ 请求注销; res.重定向“/”; }; server.listen8080;
日志“服务器正在运行…” 我看不出有什么问题,但这是我的2美分来改进它

使用压缩减少网络大小

app.use(require('compression'));
对静态文件(如图像或pdf)使用serve static

app.use(require('serve-static')('./public'))
使用中间件控制需要身份验证的端点,如查看/编辑配置文件、更改密码等

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
  })
})
注销时包括会话销毁

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

对于清理查询,可以使用类似sequelise的ORM