成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【譯】Nodejs應(yīng)用安全備忘錄

Loong_T / 1823人閱讀

摘要:所以我們整理了一個(gè)應(yīng)用安全備忘錄,以幫助你在部署啟動應(yīng)用程序的時(shí)候進(jìn)行安全檢查。這可以保護(hù)應(yīng)用程序不被攻擊。應(yīng)該用日志記錄下來,而不是顯示給用戶。

本人的博客http://www.wjs.photo/,感興趣的可以看看哦,基于NodeJs框架ThinkJs

本文翻譯自 www.risingstack.com ,并非逐字逐句的翻譯,有錯(cuò)誤的地方請指出,謝謝啦
應(yīng)用程序的安全就像是你房間里突然出現(xiàn)一只大象,那么明顯,但是寫代碼的同學(xué)還是會忽略。也都認(rèn)為應(yīng)用程序的安全非常重要但是卻很少有時(shí)間認(rèn)真對待,畢竟我們有那么多bug要改(壞笑)。所以我們整理了一個(gè)NodeJs應(yīng)用安全備忘錄,以幫助你在部署啟動NodeJs應(yīng)用程序的時(shí)候進(jìn)行安全檢查。當(dāng)然,這些項(xiàng)目大部分是通用的,適用于所有的語言和框架而不僅僅是Node.js。但是本文具體還涉及到一些Node.js的工具。感興趣的同學(xué)也可以查看我的介紹Node.js的安全性的博客。

配置管理(Configuration Management) HTTP安全頭部

Strict-Transport-Security:強(qiáng)制通過(SSL/TLS上的HTTP)連接到服務(wù)器
X-Frame-Options:提供阻止點(diǎn)擊挾持攻擊
X-XSS-Protection:啟用瀏覽器內(nèi)置的跨站點(diǎn)腳本(XSS)篩選器
X-Content-Type-Options:防止瀏覽器從MIME探查從聲明內(nèi)容類型的響應(yīng)
Content-Security-Policy:防止各種攻擊,包括跨站點(diǎn)腳本和其他跨網(wǎng)站注射
在Express中,我們可以很容易用helmet來設(shè)置這些頭部:

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

當(dāng)然,在koa框架中也可以使用:傳送門
這些頭部不只是可以放在代碼中,也可以配置在web服務(wù)器中(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服務(wù)器的配置也可以參考:這里

客戶端的敏感數(shù)據(jù)

在部署前端應(yīng)用程序時(shí)要確保不會將秘密的API公開,公開的API會被任何人訪問
雖然沒有好的自動檢查的方法,但有兩個(gè)注意點(diǎn)可以減輕由于意外而暴露敏感數(shù)據(jù)的風(fēng)險(xiǎn)
1.檢查使用的請求
2.常規(guī)的代碼審查

身份驗(yàn)證 Brute Force Protection(暴力攻擊防護(hù))

暴力破解(也稱窮舉法),即將密碼進(jìn)行逐個(gè)推算直到找到真正的密碼,然后在web應(yīng)用程序中登錄。
為了防止應(yīng)用程序受到暴力破解的攻擊,應(yīng)用程序最好要有密碼錯(cuò)誤容許次數(shù)機(jī)制,在NodeJs中,你可以使用:ratelimiter

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

當(dāng)然啦,你也可以將他包裝成一個(gè)中間件,就可以放在應(yīng)用程序中,無論是Express框架還是Koa框都有厲害的中間件,在koa框架中,他可能是這個(gè)樣子:

  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); 

我們在這里做的是有限的用戶在給定的時(shí)間里(60000毫秒)可以出錯(cuò)多少次(10次),這樣我們的程序可以減輕被暴力破解的風(fēng)險(xiǎn)。不過這些配置必須為給定的應(yīng)用,不要直接復(fù)制粘貼他們。

會話管理

安全使用Cookie的重要性不能被低估:尤其是在動態(tài)Web應(yīng)用程序,這就需要保持整個(gè)無狀態(tài)協(xié)議狀態(tài),如HTTP。
Cookie的屬性列表
secure —這個(gè)屬性設(shè)置為true時(shí)是告訴瀏覽器如果正在通過HTTPS發(fā)送請求,只發(fā)送cookie。
HttpOnly—-如果Cookie中設(shè)置了這個(gè)屬性,那么通過程序(JS腳本、Applet等)將無法讀取到Cookie信息,可以有效的用來防止諸如跨站點(diǎn)腳本攻擊
限制cookie的作用范圍
Domain--這個(gè)屬性是用來比較中被請求的URL服務(wù)器的域。如果域匹配,或者如果它是一個(gè)子域,則路徑屬性將下一個(gè)檢查。
path--除了Domain,該Cookie有效期可以指定URL路徑。如果域名和路徑匹配,那么該cookie將被請求發(fā)送。
expires --這個(gè)屬性是用來設(shè)置Cookie的到期時(shí)間,因?yàn)樵揷ookie不會過期,直到超出設(shè)定的日期

在NodeJs中,可以很容易的創(chuàng)建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); 

(這個(gè)例子是取自cookie的會話模塊文檔)。

CSRF(跨站請求偽造)

跨站請求偽造一種挾持用戶在當(dāng)前已登錄的web應(yīng)用程序上執(zhí)行非自己操作的攻擊方法,這種攻擊專門針對更改請求,而不是竊取數(shù)據(jù),因?yàn)楣粽咭矝]法比見到偽造請求的響應(yīng)
在NodeJs中要減輕這種攻擊,可以使用 [csrf] (https://www.npmjs.com/package...塊,由于這個(gè)比較底層,也有不同的框架包裝好的,這個(gè)例子是csurf模塊,用于CSRF保護(hù)明文中間件
在路由中,你需要做的是:

 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");
    });

然后在視圖層:

 
Favorite color:

(這個(gè)例子是取自csurf模塊文檔)。

數(shù)據(jù)驗(yàn)證

XSS有兩個(gè)相似,但不同類型的攻擊防范。一個(gè)是跨站腳本的反射版本,另一個(gè)是存儲跨站腳本。
反射式跨站腳本,通過注入發(fā)送帶有惡意腳本代碼參數(shù)的URL,當(dāng)URL地址被打開時(shí),特有的惡意代碼參數(shù)被HTML解析、執(zhí)行。
存儲跨站腳本,指的是惡意腳本代碼被存儲進(jìn)被攻擊的數(shù)據(jù)庫,當(dāng)其他用戶正常瀏覽網(wǎng)頁時(shí),站點(diǎn)從數(shù)據(jù)庫中讀取了非法用戶存入非法數(shù)據(jù),惡意腳本代碼被執(zhí)行。
為了抵御這類攻擊,確保你過濾或者清理用戶輸入

SQL注入

SQL注入是由用戶輸入部分或完整的SQL查詢的注入。它可以讀取敏感信息。

 select title, author from books where id=$id

在這個(gè)實(shí)例代碼中,參數(shù)$id如果用戶輸入的是2 or 1=1?,那查詢變?yōu)槿缦拢?/p>

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

防范這類攻擊的最簡單的方法是使用參數(shù)化查詢或準(zhǔn)備好的語句
SqlMap是一個(gè)開源的滲透測試工具,它可以自動檢測并利用SQL注入漏洞和接管數(shù)據(jù)庫服務(wù)器的過程。使用此工具來測試SQL注入漏洞的應(yīng)用程序。

命令注入

命令注入是由攻擊者向遠(yuǎn)程的Web服務(wù)器上運(yùn)行的系統(tǒng)命令的技術(shù)。用這種方法攻擊者可能甚至得到的系統(tǒng)的密碼。
在實(shí)際開發(fā)中,如果你有一個(gè)網(wǎng)址,如:

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

它可以變成:

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

在這個(gè)例子中%3B變成了分號,所以多個(gè)系統(tǒng)命令可以運(yùn)行。
為了抵御這類攻擊,確保你始終過濾或清理了用戶輸入。
另外,在Node.js中我們可以這樣來檢測:

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

child_process.exec創(chuàng)建一個(gè)子線程來調(diào)用執(zhí)行/bin/sh,所以他是一個(gè)bash的解釋,而不是一個(gè)程序的啟動,當(dāng)用戶輸入被傳遞給這個(gè)方法,就會被執(zhí)行,顯示目錄下的所有文件。一個(gè)新的命令被攻擊者注入。
為了防止被攻擊,可以使用child_process.execFile

安全傳輸 SSL版本,算法,密鑰長度

由于HTTP是一種明文協(xié)議,如果通過了SSL / TLS隧道,被稱為HTTPS進(jìn)行保護(hù)。如今高檔的密碼通常使用,在服務(wù)器配置錯(cuò)誤可以用來強(qiáng)制使用弱密碼 - 或者在最壞的情況沒有加密。
你必須測試:

密碼,鑰匙和重新談判的配置是否正確

證書有效期

使用工具NMAP和sslyze可以很容易掃描出來
檢查證書信息

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

在配置管理的一部分,我們使用這個(gè)briefly - Strict-Transport-Security 頭強(qiáng)制執(zhí)行安全(基于SSL的HTTP / TLS)連接到服務(wù)器上。就拿從Twitter下面的例子:

strict-transport-security:max-age=631138519 

這里max-age定義為秒,瀏覽器自動將所有的HTTP請求轉(zhuǎn)換為HTTPS的數(shù)量。
它的測試是非常簡單的:

curl -s -D- https://twitter.com/ | grep -i Strict 
拒絕服務(wù) 帳戶鎖定

帳戶鎖定是減少暴力攻擊的方法。這就意味著,如果賬戶多次登錄失敗,就讓這個(gè)賬戶在一定時(shí)間內(nèi)(最初也可以是一兩分鐘,然后就可以成倍增加)鎖定。
這可以保護(hù)應(yīng)用程序不被攻擊。

正則表達(dá)式

大多數(shù)正則表達(dá)式可能會導(dǎo)致攻擊者的破解工作變得緩慢和低效。這些的正則表達(dá)式被稱為邪惡的正則表達(dá)式:

與重復(fù)分組

里面的重復(fù)組

重復(fù)

輪換具有重疊

([a-zA-Z]+)*,(a+)+或者(a|a?)+是所有弱勢的正則表達(dá)式作為一個(gè)簡單的輸入一樣aaaaaaaaaaaaaaaaaaaaaaaa!會導(dǎo)致重計(jì)算。每增加一個(gè)a,時(shí)間就會翻倍。

在NodeJs中,如果要檢查正則表達(dá)式,你可以safe-regex

$ node safe.js "(beep|boop)*" true  $ node safe.js "(a+){10}" false 
錯(cuò)誤處理 錯(cuò)誤代碼,堆棧跟蹤

不同的錯(cuò)誤情況的應(yīng)用程序可能會泄漏對底層基礎(chǔ)架構(gòu)的敏感細(xì)節(jié),如:X-Powered-By:Express。
棧跟蹤不被視為自己的漏洞,但他們往往可能是吸引的攻擊者的信息。提供了調(diào)試信息和產(chǎn)生錯(cuò)誤操作的結(jié)果都被認(rèn)為是不好的做法。應(yīng)該用日志記錄下來,而不是顯示給用戶。

NPM

NPM有很多包提供給大家使用,但是這也是有代價(jià)的:應(yīng)該好好檢查你需要為你的應(yīng)用程序是什么。也許你使用之后可能含有重要的安全問題。

The Node Security Platform

不過幸運(yùn)的是,有一個(gè)偉大的工具--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,但他的目的是提供一種工具,不能只檢測,只是在代碼庫修復(fù)安全相關(guān)的問題。
更多信息你可以看看snyk.io
本人的博客http://www.wjs.photo/,感興趣的可以看看哦,基于NodeJs框架ThinkJs

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81190.html

相關(guān)文章

  • 性能優(yōu)化

    摘要:如果你的運(yùn)行緩慢,你可以考慮是否能優(yōu)化請求,減少對的操作,盡量少的操,或者犧牲其它的來換取性能。在認(rèn)識描述這些核心元素的過程中,我們也會分享一些當(dāng)我們構(gòu)建的時(shí)候遵守的一些經(jīng)驗(yàn)規(guī)則,一個(gè)應(yīng)用應(yīng)該保持健壯和高性能來維持競爭力。 一個(gè)開源的前端錯(cuò)誤收集工具 frontend-tracker,你值得收藏~ 蒲公英團(tuán)隊(duì)最近開發(fā)了一款前端錯(cuò)誤收集工具,名叫 frontend-tracker ,這款...

    liangzai_cool 評論0 收藏0
  • 優(yōu)秀文章收藏(慢慢消化)持續(xù)更新~

    摘要:整理收藏一些優(yōu)秀的文章及大佬博客留著慢慢學(xué)習(xí)原文協(xié)作規(guī)范中文技術(shù)文檔協(xié)作規(guī)范阮一峰編程風(fēng)格凹凸實(shí)驗(yàn)室前端代碼規(guī)范風(fēng)格指南這一次,徹底弄懂執(zhí)行機(jī)制一次弄懂徹底解決此類面試問題瀏覽器與的事件循環(huán)有何區(qū)別筆試題事件循環(huán)機(jī)制異步編程理解的異步 better-learning 整理收藏一些優(yōu)秀的文章及大佬博客留著慢慢學(xué)習(xí) 原文:https://www.ahwgs.cn/youxiuwenzhan...

    JeOam 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<