JavaScript >> Javascript 文檔 >  >> Node.js

保護您的 Node.js 應用程序

默認情況下,Node.js 本身是相當安全的。雖然,你肯定有一些事情需要注意。例如,如果您的 Node Web 應用程序開始變得越來越流行,那麼您將需要越來越多地考慮安全性,以確保您的用戶數據安全。

在過去幾週看到一些關於 Node.js 安全性的問題後,我認為編寫一份簡短指南來說明您可以採取哪些措施來保護您的應用程序會很有幫助。

這裡的許多(如果不是全部)建議非常容易遵循和實施,並且主要針對 Node 本身或其模塊。因此,我不會涉及加密或用戶身份驗證之類的內容,這有點超出了本文的範圍。這裡的許多技巧都將集中在 Node Web 框架上,因為它們通常最容易受到攻擊。

不要使用 Sudo 運行代碼

這種情況比你想像的要多,而且很危險。由於它提供 root 權限,使用 sudo 運行代碼可以消除煩人的問題,例如寫入用戶不擁有的目錄。但這只是簡單的出路,這些捷徑會帶來一堆你不應該忽視的其他問題。

相反,要找到問題的根本原因,並想辦法在不損害整個系統的情況下解決它。

因此,例如,如果您需要為 Web 服務打開端口 80,但由於您不是在 root 下運行而無法打開,那麼您應該使用 Nginx 之類的代理將請求從端口 80 轉發到您的服務的任何其他端口實際上正在運行。

如果您在 root 下運行並且您的應用程序被攻擊者接管,那麼他們就可以對您的系統做任何他們想做的事情 你的數據。這是您試圖保護自己免受的最壞情況。

避免eval 不惜一切代價

好吧,我承認,有時通過讓代碼使用 eval 執行任意 JavaScript 來使代碼更具動態性是很誘人的 ,但請相信我,這是個壞主意。

有些人甚至在解析用戶輸入變得懶惰時嘗試使用它。畢竟,V8 JavaScript 引擎非常擅長解析簡單的數學運算之類的東西,所以很容易利用它來發揮自己的優勢:

var result = eval('(13 + (2 * 23.249) / 0.981)');
// result = 60.398572884811415

有太多的方法可以反過來咬你。除非您是專家並且知道如何保護自己免受所有不同類型的惡意 JavaScript 代碼的侵害,否則請遠離這一點。

這是一個簡單的漏洞利用示例:

var userInput = req.body.userInput;    // User entered 'process.exit()'
var answer = eval(userInput);          // App quits here

運行此代碼將關閉您的應用程序,從而對您的用戶造成拒絕服務 (DOS)。

添加/刪除 HTTP 標頭

有很多 HTTP 標頭可以幫助您也可以傷害您。以正確的方式使用正確的部分是棘手的部分。

Express 默認添加 X-Powered-By: Express 標頭,它實際上只是告訴潛在的攻擊者您正在使用什麼 Web 框架,以及如何根據已知的漏洞利用它。他們掌握的關於您的技術堆棧的信息越多,他們攻擊它的方式就越多。

這就是頭盔發揮作用的地方。 Helmet 是 Node 的一個小模塊,它通過添加/刪除各種 HTTP 標頭來幫助保護 Express/Connect 應用程序。

您可以做任何事情,從啟用 HSTS 到防止點擊劫持攻擊。這些事情對你來說幾乎不需要任何工作,但它們可以讓世界變得不同。因此,如果您正在構建 Express 應用程序,這應該是不費吹灰之力的(實際上,對於任何 Web 服務,您都應該這樣做)。

使用像 Retire.js 這樣的掃描實用程序

並非所有程序員都是安全專家,雖然您應該盡最大努力了解 XSS 或 SQL 注入等常見漏洞,但很難全部了解。

為了彌補這一點,您應該嘗試使用 Retire.js 之類的工具,它會掃描您的 Node 應用程序以查找包含漏洞的依賴項。

例如,Ember.js 在幾個不同版本中存在特定的 XSS 漏洞(CVE-2014-0046),所有這些漏洞都由 Retire.js 檢查。當你執行 retire 在您的項目目錄中,它將比較 node_modules 中的包 到漏洞的公共存儲庫,並向您報告您的哪些依賴項不安全。

許多這些軟件包中存在太多漏洞,無法自行檢查,因此最好讓這樣的工具為您解決。

借助提供的插件,您可以通過將其與 Grunt 或 Gulp 集成來輕鬆地將其作為工作流程的一部分。詳細信息在 README 中。

另一種選擇是在 prepublish 中運行它 命令,它將在 npm 將您的包發送到存儲庫之前運行。只需將這樣的內容添加到您的 package.json

{
  "name": "myProject",
  "version": "0.0.1",
  "scripts": {
    "prepublish": "retire",
  }
}

小心child_process 模塊

喜歡 eval , 使用 spawnexec 來自 child_process 模塊可能真的很有用,但也真的 危險的。任何潛入這些命令的用戶輸入都可能意味著您的系統很快就會受到損害(尤其是如果您使用 sudo 運行您的應用程序!)。

例如,Image Magick 是一個非常流行的命令行工具,用於顯示、轉換和編輯圖像。現在有這麼多使用圖像的網絡應用程序,Image Magick 經常在後台用於裁剪和調整大小等操作。要將此工具與 Node 一起使用,您可能會看到如下代碼:

child = child_process.exec('convert ' + imageFilename + ' ' + imageFilename + '.bmp', ['-depth', '24'], function(err, stdout, stderr) {
    console.log('Done');
});

這可能看起來無害,但使用精心製作的 imageFilename ,你可以在shell中執行任何你想要的代碼。

exec 僅當它不依賴於用戶輸入時才應使用 如果論點經過嚴格清理。更好的是,檢查 npm 以獲取包裝命令行工具的庫。這些通常是在考慮這種安全性的情況下構建的,或者至少更多地關注代碼以檢查問題。對於 Image Magick,有幾個模塊可用,例如 gm。

了解漏洞

Web 應用程序中的許多漏洞適用於所有服務,無論使用何種編程語言和框架。雖然,如何 您攻擊這些服務可能會因您使用的技術堆棧而異。為了更好地保護自己,您確實需要了解這些漏洞的工作原理。

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

幸運的是,OWASP 列出了 Web 應用程序的 10 大風險。查看這些內容,然後對您的網站進行徹底分析,看看其中是否適用於您。

更好的是,查看 NodeGoat,這是一個由 OWASP 創建的可部署網站,旨在教您如何專門識別 Node 應用程序中的這些風險。沒有比親自動手學習這些概念更好的方法了。

提供的教程將引導您了解所有風險,並展示如何利用和防禦漏洞的具體示例。例如,以下是 OWASP 提供的視頻,展示瞭如何使用 Web 表單註入 JavaScript:

更多信息

節點安全是一個大話題,因此在這裡嘗試涵蓋所有內容是不合理的。如果您有興趣了解更多詳細信息,我建議您閱讀更多資源,例如:

  • 節點安全公告
  • Node.js 平台 Web 應用程序安全性分析 [PDF]
  • 在 Node.js 中打開被認為有害的文件
  • Node.js 安全 Google 組
  • Node.js Web 應用程序最容易被忽視的安全威脅 [PDF]

結論

應用程序的安全性常常是開發和設計的事後考慮。僅僅讓你的代碼正常工作就已經夠難的了,更不用說讓你的用戶安全使用了。

幸運的是,您並不是唯一遇到這些問題的人,這意味著有很多由其他人創建的工具和資源可以幫助您快速輕鬆地保護您的應用程序。只需花時間搜索 NPM,在論壇上提問,甚至聘請專家。絕對值得花時間和金錢!

您還有哪些其他方法可以保護您的 Node 應用程序?請在評論中告訴我們!


Tutorial JavaScript 教程
  1. JavaScript 中的靜態屬性和函數

  2. 羅馬數字轉換器

  3. 創建一個 React 日曆組件:第 2 部分

  4. 垃圾回收

  5. 向數字時鐘添加鬧鐘

  6. 使用 zx 編寫基於 JS 的 Bash 腳本

  7. Angular 基礎知識:Angular 中的路由器鏈接和通配符路由

  1. 在 React 中使用 Web Share API

  2. 如何輕鬆找到博客內容創意?

  3. 使用 Node.JS 製作您自己的電子郵件訂閱服務

  4. 使用 Netlify lambda 函數從 GatsbyJS 站點發送電子郵件

  5. 簡單的代碼任務應該很簡單

  6. VueJS 中的模板內計算屬性聲明

  7. 使用 Typescript 自動化我的博客文章發布過程

  1. JavaScript let 關鍵字 |基本

  2. Bootstrap 4導航選項卡內容未在初始頁面加載時顯示內容

  3. 使用 TDD 創建 Odoo 14 Markdown 小部件字段 - 第 2 部分

  4. 帶有 Ionic React 的貨幣選擇器和格式化程序