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

毫無疑問,Node.js現在是越來越成熟。儘管這樣,我們還沒有形成很多的安全準則。在這篇文章中,我會分享一些關於提高Node.js安全性方面的技巧。不用eval,贏得朋友你不僅僅要避免使用eval - 你也應該避免使用在下列情況,他們等價於直接使用eval;

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

注* eval: 直接將字元串轉化為代碼執行,如: eval("alert("hi")")為什麼不要用eval?如果你對用戶輸入的內容進行了eval運行(千萬不要這麼設計),你就有可能受到注入攻擊。並且這種運行方式很慢。請使用Strict嚴格模式使用這種模式將限制你的變數聲明,並總會將一些可能隱藏的錯誤拋出來,下面是幾個例子:不可刪除的屬性

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

對象屬性必須是唯一的

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

禁止使用with

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

注* 更多參考:為什麼使用"use strict"可以節約你的時間5個經典的前端面試問題靜態代碼分析使用 JSLint, JSHint 或 ESLint 來靜態分析你的代碼. 靜態代碼分析可以讓你在早期捕獲一些潛在的BUG.測試這一點不言而喻:測試,測試再測試。不僅僅是單元測試,你應該進行全面測試(test pyramid)。不要直接使用: sudo node app.js很多人使用超級用戶許可權運行Node應用,不是嗎?因為他們希望應用程序直接偵聽80或443埠(注* http和https的默認埠)這一點是不對的,進程中的任何一個錯誤/漏洞都將讓整個系統宕機,然後你就什麼也幹不了。所以你應該使用一個HTTP反向代理服務去轉發這些請求。可以用nginx, Apache 你看著辦。注* 相關閱讀NodeJS on Nginx: 使用nginx反向代理處理靜態頁面拿什麼守護你的Node.JS進程: Node出錯崩潰了怎麼辦?避免命令(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注* 更多內容你不知道的JavaScript用法,Hacker是這樣寫JS的QQ郵箱是如何泄密的:JSON劫持漏洞攻防原理及演練防止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中的內容相匹配
  • 原文地址: blog.codeship.com
    推薦閱讀:

    黑客、紅客、白帽子之間的技術較量,為什麼大公司都有黑客團隊?
    滲透測試流程與方法
    看不見的熱攻擊之攻擊手機鎖屏密碼(一)
    黑客版「DD打人」了解一下?
    兩名90後「黑客」 敲詐網吧被抓

    TAG:安全 | 網站 | 伺服器 | 黑客攻擊 | 安全性 | 提高 | 技巧 | Web伺服器 | 黑客 |