iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
概述

提供在Node.js中開發更安全程式碼的一般最佳實踐。

建議
  • 始終驗證外部輸入
    通常軟體中最危險的部分是它將處理不受信任的外部資料的地方。
    因此這是確保給予關注的最重要領域之一。
    • 問題範例
      https://cwe.mitre.org/data/definitions/20.html
      function buildList(var untrustedListSize)
      {
          if(0> untrustedListSize)
          {
              new Error("為列表大小提供了負值!");
          }
      
          var list = new Widget [untrustedListSize];
          list [0] = new Widget();
      }
      
    • 修正
      驗證函式庫是一個受歡迎的選擇。
      express-validator.js
    • 風險等級
      它要求程式碼的底層區域很容易受到利用,因此,這被視為低嚴重性問題。
      儘管如果基礎程式碼容易受到攻擊,則將導致高嚴重漏洞。
    • 參考
      MITRE指南
      OWASP指南
  • HTTP標頭
    HTTP標頭可以使頁面開發人員通知瀏覽器對Web攻擊採取各種保護措施。
    例如Clickjacking和XSS。
    • 問題範例
      • X-Frame-Options:防止點擊劫持
      • Strict-Transport-Security:實施HTTPS並防禦降級攻擊
      • X-XSS-Protection:在支持此標頭的瀏覽器中啟用XSS保護
      • Content-Security-Policy:可以限制程式碼腳本來自並可以執行
    • 修正
      手動檢查並根據您的HTTP連接採用標頭。
      OWASP在其安全標頭項目中提供了不錯的相關標頭列表。
      此外也推薦使用Helmet(也可通過npm獲得)來幫助提供這些保護。
    • 風險等級
      低高
    • 參考
  • 使用eval()
    使用eval()函數非常危險,幾乎不需要。
    該功能使攻擊者可以在目標站點上直接簡單地執行程式碼。
    • 問題範例
      val(<Any Thing>);
      ``
      
    • 修正
      通常執行不受信任的程式碼是完全不安全的,因此應完全避免。
      任何此類使用的情況都將被認真考慮。
      在某些情況下,使用暴露Node.js V8引擎的本地VM模組是可以接受的,在其他情況下,可能需要更強大的隔離。
    • 風險等級
      低高
    • 參考
      • https://developer.mozilla.org/zh- CN/docs/Archive/Add- ons/Overlay_Extensions/XUL_School/Appendix_C:_Avoid_using_eval_in_Add- ons(關於在插件中使用的討論,但也適用於其他地方)
  • 始終使用HTTPS( > TLS1.1)
    HTTP流量是未加密的,這意味著跨不受信任/不受控制的通道的任何流量都是完全不可信的。
    鑑於從加密通道獲得的信任增加,HTTPS的性能幾乎可以忽略不計。
  • Localhost 並非本質上不受網路安全
    我們發現,許多團隊錯誤地認為本地客戶端REST服務的接口被設計為綁定到localhost可以防止遠程攻擊者的入侵。
    但是,可以通過Web瀏覽器訪問localhost,從而使這些服務容易受到惡意網頁的攻擊。
    • 問題範例
      參見CVE-2017-12939
    • 修正
      在您的項目中啟用CORS。
      範例:
      Access-Control-Allow-Origin:https://localhost:<通訊埠>
    • 風險等級
    • 參考
      • Express有一個流行的CORS庫:https://github.com/expressjs/cors
  • NPM 打包工具和風險
    npm的審核選項可以自動掃描項目的已安裝軟體,並具有嚴重性等級以及指向所掃描風險的詳細訊息的鏈接。
    建議對所有項目定期運行此程序,以幫助識別依賴項中可能存在的漏洞。
    未修補的npm軟體包可以很容易地被利用,因為漏洞一經修補便被公開。
    • 問題範例
      [NPM審核輸出](../images/node-npm-audit.png)
      ``
      
    • 修正
      /審核選項已經提供了簡單的"自動修復"功能,可以為您提供幫助,
      /此外,npmjs發布了npm審核修復選項,該選項應自動解決盡可能多的漏洞。
      /例如:
      [NPM審核命令](../images/node-npm-audit-2.png)
      ``
      
    • 風險等級
      該工具將為發現的每個漏洞提供風險等級。
    • 參考
      • [npm審核](https://blog.npmjs.org/post/173719309445/npm-audit-identify-and-fix-insecure)
      • [npm審核修復](https://blog.npmjs.org/post/174001864165/v610- next0)
  • 過時的軟體包
    與所有第三方原始碼碼一樣,確保使用軟體包的最新可用版本。
    漏洞每天都會被發現,通常與更新包一樣容易修復。
    • 問題範例
      Express,一個廣泛使用的HTTP程序包,在這裡發布了它們的漏洞:
      https://expressjs.com/en/advanced/security-updates.html
    • 修正
      使用npm update,或利用本文檔中描述的npm audit命令。
    • 風險等級
      漏洞的風險等級由報告問題的供應商確定。
其他
- Node.js安全問題的訊息:https://www.owasp.org/images/f/fa/AppSecIL2016_NodeJS-Security_LiranTal.pdf
- Express小組的安全建議:https://expressjs.com/en/advanced/best-practice-security.html
- OWASP的Node Goat項目:https://github.com/OWASP/NodeGoat

上一篇
.NET/C# 最佳實踐
下一篇
Golang 最佳實踐
系列文
安全軟體開發生命週期(SSDLC)學習筆記36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言