我的博客http://www.wjs.photo/,有兴趣的可以看看,基于NodeJs框架的ThinkJs本文翻译自www.risingstack.com,不是逐字翻译,如有错误请指出,谢谢。应用程序的安全性就像一头大象突然出现在你的房间里。这么明显,但是写代码的同学还是会忽略。他们也认为应用程序安全非常重要,但很少有时间认真对待它,毕竟我们有那么多错误要修复(傻笑)。所以我们整理了一份NodeJs应用安全备忘录,帮助大家在部署和启动NodeJs应用时进行安全检查。当然,这些项目大部分都是通用的,适用于所有语言和框架,而不仅仅是Node.js。但是这篇文章还专门涉及到一些Node.js工具。有兴趣的同学也可以看看我介绍Node.js安全的博客。配置管理(ConfigurationManagement)HTTP安全头Strict-Transport-Security:强制通过(HTTPoverSSL/TLS)连接服务器X-Frame-Options:提供防止点击劫持攻击X-XSS-Protection:启用浏览器内置-在跨站点脚本(XSS)过滤器中X-Content-Type-Options:防止浏览器从声明的内容类型中嗅探MIME响应Content-Security-Policy:防止各种攻击,包括跨站点脚本和其他跨站点注入在Express中,我们可以使用helmet轻松设置这些标头:varexpress=require('express');varhelmet=require('头盔');varapp=express();app.use(头盔());当然也可以用在koa框架中:入口的headers不仅可以放在代码中,还可以配置在web服务器(Apache、nginx)中,这样就省去了改程序代码#nginx.confadd_headerX-Frame-OptionsSAMEORIGIN;add_headerX-Content-Type-Optionsnosniff;add_headerX-XSS-Protection"1;mode=block";add_headerContent-Security-Policy"default-src'self'";nginx服务器配置也可以参考:在客户端部署敏感数据的前端应用时,保证secretAPI不会对外公开,??公开的API任何人都可以访问。虽然没有很好的自动检测方法,但有两点可以缓解。意外暴露敏感数据风险1.检查使用过的请求2.定期代码审查认证BruteForceProtection(蛮力保护)暴力破解(也称穷举法),就是逐一计算密码直到找到真实密码,然后登录Web应用程序。为了防止应用程序被暴力破解攻击,应用程序应该有密码容错机制。在NodeJs中,你可以使用:ratelimitervarlimit=newLimiter({id:email,db:db});限制。得到(函数(错误,限制){});当然,你也可以把它包装成一个中间件,放在应用程序中。Express框架和Koa框架都有强大的中间件。在koa框架中,它可能看起来像这样:varratelimit=require('koa-ratelimit');varredis=require('redis');varkoa=require('koa');varapp=koa();varemailBasedRatelimit=ratelimit({db:redis.createClient(),duration:60000,max:10,id:function(context){returncontext.body.email;}});varipBasedRatelimit=ratelimit({db:redis.createClient(),duration:60000,max:10,id:function(context){returncontext.ip;}});app.post('/login',ipBasedRatelimit,emailBasedRatelimit,handleLogin);我们在这里所做的是限制用户在给定时间内(60000毫秒)可以犯错的次数(10次),以便我们的程序可以减轻被暴力破解的风险。但是,这些配置必须针对给定的应用程序,不要直接复制和粘贴它们。不能低估会话管理和安全使用cookie的重要性:尤其是在动态Web应用程序中,它需要在整个无状态协议(如HTTP)中维护状态。Cookie的属性列表:secure-当此属性设置为true时,它??告诉浏览器仅在通过HTTPS发送请求时才发送cookie。HttpOnly——如果在cookie中设置该属性,则cookie信息将不会被程序(JS脚本、Applets等)读取,可有效用于防止跨站脚本攻击,如限制cookie的范围cookie域——此属性是比较中请求的URL服务器的域。如果域匹配,或者它是子域,则接下来将检查路径属性。path--除了Domain,cookie有效期可以指定URL路径。如果域名和路径匹配,则cookie将与请求一起发送。expires--该属性用于设置cookie的过期时间,因为cookie要到超过设置的日期才会过期在NodeJs中,可以很方便的创建cookie,通过cookies或者cookie-sessionvarcookieSession=require('cookie-会议');varexpress=require('快递');varapp=express();app.use(cookieSession({name:'session',keys:[process.env.COOKIE_KEY1,process.env.COOKIE_KEY2]}));app.use(function(req,res,next){varn=req.session.views||0;req.session.views=n++;res.end(n+'views');});app.listen(3000);(此示例取自cookie的会话模块文档)。CSRF(Cross-siterequestforgery)跨站请求伪造是一种劫持用户在当前登录的web应用程序上执行非自己操作的攻击方式。Fabi看到在NodeJs中对伪造请求的响应可以缓解这种攻击,可以使用[csrf](https://www.npmjs.com/package...block,因为这个比较底层,还有不同的框架对其进行封装是的,这个例子是csurf模块,用于路由中的CSRF保护明文中间件,你需要做的是:varcookieParser=require('cookie-parser');varcsrf=require('csurf');varbodyParser=require('body-parser');varexpress=require('express');//设置路由中间件varcsrfProtection=csrf({cookie:true});varparseForm=bodyParser.urlencoded({extended:false});//创建expressappvarapp=express();//我们需要这个,因为csrfProtection中的“cookie”为真app.use(cookieParser());app.get('/form',csrfProtection,function(req,res){//将csrfToken传递给视图res.render('send',{csrfToken:req.csrfToken()});});app.post('/process',parseForm,csrfProtection,function(req,res){res.send('正在处理数据');});然后在视图层:
