【译】Nodejs运用平安备忘录

本人的博客http://www.wjs.photo/,感兴趣的能够看看哦,基于NodeJs框架ThinkJs

本文翻译自 www.risingstack.com ,并不是逐字逐句的翻译,有毛病的地方请指出,感谢啦
运用顺序的平安就像是你房间里倏忽涌现一只大象,那末显著,然则写代码的同砚照样会疏忽。也都以为运用顺序的平安异常主要然则却很少有时刻认真对待,毕竟我们有那末多bug要改(坏笑)。所以我们整理了一个NodeJs运用平安备忘录,以协助你在布置启动NodeJs运用顺序的时刻举行平安搜检。固然,这些项目大部份是通用的,适用于一切的语言和框架而不仅仅是Node.js。然则本文详细还涉及到一些Node.js的东西。感兴趣的同砚也能够检察我的引见Node.js的平安性的博客。

设置治理(Configuration Management)

HTTP平安头部

Strict-Transport-Security:强迫经由历程(SSL/TLS上的HTTP)连接到服务器
X-Frame-Options:供应阻挠点击挟持进击
X-XSS-Protection:启用阅读器内置的跨站点剧本(XSS)挑选器
X-Content-Type-Options:防备阅读器从MIME探查从声明内容范例的相应
Content-Security-Policy:防备种种进击,包含跨站点剧本和其他跨网站打针
在Express中,我们能够很轻易用helmet来设置这些头部:

var express = require('express'); 
var helmet = require('helmet');
var app = express();
app.use(helmet());

固然,在koa框架中也能够运用:传送门
这些头部不只是能够放在代码中,也能够设置在web服务器中(Apache、nginx),如许也就省了修改顺序代码

    # nginx.conf
    add_header X-Frame-Options SAMEORIGIN; 
    add_header X-Content-Type-Options nosniff; 
    add_header X-XSS-Protection "1; mode=block"; 
    add_header Content-Security-Policy "default-src 'self'";

nginx服务器的设置也能够参考:这里

客户端的敏感数据

在布置前端运用顺序时要确保不会将隐秘的API公然,公然的API会被任何人接见
虽然没有好的自动搜检的要领,但有两个注重点能够减轻由于不测而暴露敏感数据的风险
1.搜检运用的要求
2.通例的代码检察

身份考证

Brute Force Protection(暴力进击防护)

暴力破解(也称穷举法),行将暗码举行逐一推算直到找到真正的暗码,然后在web运用顺序中登录。
为了防备运用顺序遭到暴力破解的进击,运用顺序最好要有暗码毛病允许次数机制,在NodeJs中,你能够运用:ratelimiter

      var limit = new Limiter({ id: email, db: db }); 
      limit.get(function(err, limit) { });
      

固然啦,你也能够将他包装成一个中间件,就能够放在运用顺序中,无论是Express框架照样Koa框都有凶猛的中间件,在koa框架中,他多是这个模样:

  var ratelimit = require('koa-ratelimit');  
  var redis = require('redis');  var koa = require('koa');  
  var app = koa(); 
  var emailBasedRatelimit = ratelimit({
  db: redis.createClient(),   
  duration: 60000,   
  max: 10,   
  id: function (context) {     
  return context.body.email;   
  } }); 
  var ipBasedRatelimit = ratelimit({
  db: redis.createClient(),   
  duration: 60000,   
  max: 10,   
  id: function (context) {     
   return context.ip;   
   } 
   }); 
   app.post('/login', ipBasedRatelimit, emailBasedRatelimit, handleLogin); 

我们在这里做的是有限的用户在给定的时刻里(60000毫秒)能够失足多少次(10次),如许我们的顺序能够减轻被暴力破解的风险。不过这些设置必需为给定的运用,不要直接复制粘贴他们。

会话治理

平安运用Cookie的主要性不能被低估:尤其是在动态Web运用顺序,这就须要坚持全部无状况协定状况,如HTTP
Cookie的属性列表
secure —这个属性设置为true时是通知阅读器假如正在经由历程HTTPS发送要求,只发送cookie。
HttpOnly—-假如Cookie中设置了这个属性,那末经由历程顺序(JS剧本、Applet等)将没法读取到Cookie信息,能够有用的用来防备诸如跨站点剧本进击
限定cookie的作用局限
Domain–这个属性是用来比较中被要求的URL服务器的域。假如域婚配,或许假如它是一个子域,则途径属性将下一个搜检。
path–除了Domain,该Cookie有用期能够指定URL途径。假如域名和途径婚配,那末该cookie将被要求发送。
expires –这个属性是用来设置Cookie的到期时刻,由于该cookie不会逾期,直到超越设定的日期

在NodeJs中,能够很轻易的建立cookie, 经由历程cookies或许cookie-session

 var cookieSession = require('cookie-session');  
 var express = require('express'); var app = express(); 
 app.use(cookieSession({    name: 'session',   
 keys: [     process.env.COOKIE_KEY1,     process.env.COOKIE_KEY2   ] }));
 app.use(function (req, res, next) {    
     var n = req.session.views || 0;   
     req.session.views = n++;    
     res.end(n + ' views'); 
    }); 
 app.listen(3000); 

(这个例子是取自cookie的会话模块文档)。

CSRF(跨站要求捏造)

跨站要求捏造一种挟持用户在当前已登录的web运用顺序上实行非本身操纵的进击要领,这类进击特地针对变动要求,而不是盗取数据,由于进击者也没法比见到捏造要求的相应
在NodeJs中要减轻这类进击,能够运用 [csrf] (https://www.npmjs.com/package…块,由于这个比较底层,也有差别的框架包装好的,这个例子是csurf模块,用于CSRF庇护明文中间件
在路由中,你须要做的是:

 var cookieParser = require('cookie-parser');   
 var csrf = require('csurf');  
 var bodyParser = require('body-parser');         
 var express = require('express'); 
 // setup route middlewares 
 var csrfProtection = csrf({ cookie: true });  
 var parseForm = bodyParser.urlencoded({ extended: false }); 
 // create express app 
 var app = express(); 
 // we need this because "cookie" is true in csrfProtection  
 app.use(cookieParser()); 
 app.get('/form', csrfProtection, function(req, res) {  
 // pass the csrfToken to the view   
   res.render('send', { csrfToken: req.csrfToken() }); }); 
   app.post('/process', parseForm, csrfProtection, function(req, res) {    
     res.send('data is being processed');
    });

然后在视图层:

 <form action="/process" method="POST">    
  <input type="hidden" name="_csrf" value="{{csrfToken}}">Favorite color: 
  <input type="text" name="favoriteColor">
  <button type="submit">Submit</button>
 </form> 

(这个例子是取自csurf模块文档)。

数据考证

XSS有两个类似,但差别范例的进击提防。一个是跨站剧本的反射版本,另一个是存储跨站剧本。
反射式跨站剧本,经由历程注入发送带有歹意剧本代码参数的URL,当URL地点被翻开时,特有的歹意代码参数被HTML剖析、实行。
存储跨站剧本,指的是歹意剧本代码被存储进被进击的数据库,当其他用户一般阅读网页时,站点从数据库中读取了不法用户存入不法数据,歹意剧本代码被实行。
为了抵抗这类进击,确保你过滤或许清算用户输入

SQL注入

SQL注入是由用户输入部份或完全的SQL查询的注入。它能够读取敏感信息。

 select title, author from books where id=$id

在这个实例代码中,参数$id假如用户输入的是2 or 1=1?,那查询变成以下:

select title, author from books where id=2 or 1=1

提防这类进击的最简朴的要领是运用参数化查询或准备好的语句
SqlMap是一个开源的渗入测试东西,它能够自动检测并应用SQL注入破绽和接受数据库服务器的历程。运用此东西来测试SQL注入破绽的运用顺序。

敕令注入

敕令注入是由进击者向长途的Web服务器上运转的体系敕令的手艺。用这类要领进击者能够以至获得的体系的暗码。
在现实开辟中,假如你有一个网址,如:

https://example.com/downloads?file=user1.txt 

它能够变成:

https://example.com/downloads?file=%3Bcat%20/etc/passwd 

在这个例子中%3B变成了分号,所以多个体系敕令能够运转。
为了抵抗这类进击,确保你一直过滤或清算了用户输入
别的,在Node.js中我们能够如许来检测:

child_process.exec('ls', function (err, data) {      console.log(data); });

child_process.exec建立一个子线程来挪用实行/bin/sh,所以他是一个bash的诠释,而不是一个顺序的启动,当用户输入被传递给这个要领,就会被实行,显现目录下的一切文件。一个新的敕令被进击者注入。
为了防备被进击,能够运用child_process.execFile

平安传输

SSL版本,算法,密钥长度

由于HTTP是一种明文协定,假如经由历程了SSL / TLS隧道,被称为HTTPS举行庇护。现在高级的暗码一般运用,在服务器设置毛病能够用来强迫运用弱暗码 – 或许在最坏的状况没有加密。
你必需测试:

  • 暗码,钥匙和从新商洽的设置是不是准确

  • 证书有用期

运用东西NMAPsslyze能够很轻易扫描出来
搜检证书信息

nmap --script ssl-cert,ssl-enum-ciphers -p 443,465,993,995 www.example.com

应用sslyze能够测试SSL / TLS的破绽

./sslyze.py --regular example.com:443

HSTS

在设置治理的一部份,我们运用这个briefly – Strict-Transport-Security 头强迫实行平安(基于SSL的HTTP / TLS)连接到服务器上。就拿从Twitter下面的例子:

strict-transport-security:max-age=631138519 

这里max-age定义为秒,阅读器自动将一切的HTTP要求转换为HTTPS的数目。
它的测试是异常简朴的:

curl -s -D- https://twitter.com/ | grep -i Strict 

拒绝服务

帐户锁定

帐户锁定是削减暴力进击的要领。这就意味着,假如账户屡次登录失利,就让这个账户在肯定时刻内(最初也能够是一两分钟,然后就能够成倍增添)锁定。
这能够庇护运用顺序不被进击。

正则表达式

大多数正则表达式能够会致使进击者的破解事情变得迟缓和低效。这些的正则表达式被称为罪恶的正则表达式:

  • 与反复分组

  • 内里的反复组

    • 反复

    • 轮换具有堆叠

([a-zA-Z]+)*,(a+)+或许(a|a?)+是一切弱势的正则表达式作为一个简朴的输入一样aaaaaaaaaaaaaaaaaaaaaaaa!会致使重盘算。每增添一个a,时刻就会翻倍。

在NodeJs中,假如要搜检正则表达式,你能够safe-regex

$ node safe.js '(beep|boop)*' true  $ node safe.js '(a+){10}' false 

毛病处理

毛病代码,客栈跟踪

差别的毛病状况的运用顺序能够会走漏对底层基本架构的敏感细节,如:X-Powered-By:Express。
栈跟踪不被视为本身的破绽,但他们每每多是吸收的进击者的信息。供应了调试信息和发生毛病操纵的效果都被以为是不好的做法。应当用日记记录下来,而不是显现给用户。

NPM

NPM有许多包供应给人人运用,然则这也是有价值的:应当好好搜检你须要为你的运用顺序是什么。或许你运用以后能够含有主要的平安题目。

The Node Security Platform

不过荣幸的是,有一个巨大的东西–The Node Security Platform,能够搜检运用的模块为已知的破绽。

npm i nsp -g  # either audit the shrinkwrap nsp audit-shrinkwrap  # or the package.json nsp audit-package 

你还能够运用requireSafe

SnykSnyk

SnykSnyk类似于The Node Security Platform,但他的目标是供应一种东西,不能只检测,只是在代码库修复平安相干的题目。
更多信息你能够看看snyk.io
本人的博客http://www.wjs.photo/,感兴趣的能够看看哦,基于NodeJs框架ThinkJs

    原文作者:wjs笨小孩
    原文地址: https://segmentfault.com/a/1190000008096418
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞