提升NodeJS網站的安全性:Web服務器防黑客攻擊技巧

毫無疑問,Node.js如今是愈來愈成熟。儘管這樣,咱們尚未造成不少的安全準則。
在這篇文章中,我會分享一些關於提升Node.js安全性方面的技巧。php

不用eval,贏得朋友

你不只僅要避免使用eval - 你也應該避免使用在下列狀況,他們等價於直接使用eval;node

setInterval(String, 2)
setTimeout(String, 2)
new Function(String)

注* eval: 直接將字符串轉化爲代碼執行,如: eval('alert("hi")')nginx

爲何不要用eval?

若是你對用戶輸入的內容進行了eval運行(千萬不要這麼設計),你就有可能受到注入攻擊。而且這種運行方式很慢。shell

請使用Strict嚴格模式

使用這種模式將限制你的變量聲明,並總會將一些可能隱藏的錯誤拋出來,下面是幾個例子:安全

1.不可刪除的屬性

'use strict';
delete Object.prototype; // TypeError

2. 對象屬性必須是惟一的

'use strict';  
var obj = {  
    a: 1, 
    a: 2 
}; 
// syntax error

3.禁止使用with

var obj = { x: 17 };  
with (obj) // !!! syntax error  
{

}

靜態代碼分析

使用 JSLint, JSHint 或 ESLint 來靜態分析你的代碼. 靜態代碼分析可讓你在早期捕獲一些潛在的BUG.服務器

測試

這一點不言而喻:測試,測試再測試。cookie

不只僅是單元測試,你應該進行全面測試(test pyramid)。app

不要直接使用: sudo node app.js

不少人使用超級用戶權限運行Node應用,不是嗎?由於他們但願應用程序直接偵聽80或443端口(注* http和https的默認端口)dom

這一點是不對的,進程中的任何一個錯誤/漏洞都將讓整個系統宕機,而後你就什麼也幹不了。單元測試

因此你應該使用一個HTTP反向代理服務去轉發這些請求。能夠用nginx, Apache 你看着辦。

避免命令(shell command)注入

下面的代碼段有什麼問題?

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

child_process.exec 命令調用的是 /bin/sh, 它啓動了一個解釋器,而非程序。

這是有問題的,當該方法執行用戶輸入的一個方法,比於一個反引號或$()中的內容,一個新的命令就可能被攻擊者注入。

爲了不這個問題,你只須要使用child_process.execFile。詳解

臨時文件

建立文件時,如處理上傳的文件格外注意。這些文件能夠輕鬆吃掉你全部的磁盤空間。

爲了解決這個問題,你應該使用Streams。

加密你的Web應用

不光是Node-全部的Web應用程序都應該加密。(注* https)

跨站腳本攻擊(Reflected Cross Site Scripting)

發生這種狀況時,攻擊者注入可執行代碼的HTTP響應。一個應用程序容易受到這種類型的攻擊,它會在客戶端執行未驗證的腳本(主要是用Javascript寫的)。它使攻擊者可以竊取cookie,剪貼板的內容或修改頁面自己。

好比

http://example.com/index.php?user=<script>alert(123)</script>

若是這條用戶查詢未通過驗證直接插入到DOM(HTML)中,它就會被執行。

怎麼避免

永遠不要往DOM中插入不可信的數據
在插入前去除HTML

防止Cookie被盜

默認狀況下,Cookie能夠經過Javascript在同一個域中讀取。這樣可能會被跨站點腳本攻擊。並且它們還有可能被第三方的JavaScript庫閱讀。

例如

var cookies = document.cookie.split('; ');

怎樣避免

爲了防止這種狀況,你能夠在Cookies上使用HttpOnly,這個標籤可讓JavaScript沒法讀取這個cookie。 (注* 好比服務器端用到的Cookie)

內容加密策略

內容安全策略(CSP)是一個附加的安全層,幫助檢測和緩解某些類型的攻擊,包括跨站點腳本(XSS)和數據注入攻擊。

CSP能夠經過 Content-Security-Policy 被啓用。

好比:

Content-Security-Policy: default-src 'self' *.mydomain.com

注* CSP的更多內容

這個header頭信息將只接收信任的域名及其子域名的發過來的內容。

跨站請求僞造 (Cross-Site Request Forgery)

CSRF是一種迫使終端用戶在他目前已驗證受權的Web應用程序中執行其它的actions。

這時侯問題就可能發生了,由於cookie也會發送到被請求的網站(此網站你已經被受權) - 即便當這些請求來自不一樣的位置。

例如

<body onload="document.forms[0].submit()">
    <form method="POST" action="http://yoursite.com/user/delete">
    <input type="hidden" name="id" value="123555.">
  </form>
</body>

注* 此頁面在另一個域名中

這樣會直接致使這個用戶信息被刪除。

怎樣阻止

爲了防止CSRF,您應該實現同步令牌模式 - 幸運的是,node社區已經幫你作了。下面是它的工做原理:

當發起一個GET請求時,服務器檢查你的CSRF令牌 - 若是它不存在,建立一個
當用戶顯示輸入時,確保添加一個隱藏的CSRF令牌值
當Form表單提交時,確保該值與該表單與Session中的內容相匹配


via ourjs
原文

相關文章
相關標籤/搜索