首頁 > web前端 > js教程 > 如何消除 Node.js 應用程式中的漏洞:編寫安全 JavaScript 程式碼的指南

如何消除 Node.js 應用程式中的漏洞:編寫安全 JavaScript 程式碼的指南

Linda Hamilton
發布: 2024-11-13 17:25:02
原創
379 人瀏覽過

How to Kill Vulnerabilities in Your Node.js App: A Guide to Writing Secure JavaScript Code

Js/Ts 和 Node.js 徹底改變了軟體工程世界,但能力越大,責任越大? ️。由於軟體包如此之多,工程節奏如此之快,漏洞必然會潛入其中。在本文中,我們將解決 JavaScript 生態系統中潛伏的最常見漏洞,並向您展示如何透過安全程式碼實踐「殺死」它們。


1. 依賴漏洞

問題:JavaScript 生態系統嚴重依賴來自 npm 等地方的套件。當您安裝這些軟體包時,您通常會引入額外的依賴項。不幸的是,並非所有軟體包的維護都考慮到了安全性,有些軟體包甚至故意帶有惡意程式碼。

  • 審核依賴項:執行 npm 審核以檢查依賴項中是否存在任何已知漏洞。這將為您提供報告和解決問題的建議。
  • 定期更新軟體包:使用 npm outdated 檢查是否有過時的軟體包,特別是那些有安全修補程式的軟體包。保持最新狀態有助於防止漏洞。
  • 使用以安全為中心的工具:Snyk 或 OWASP 依賴項檢查等工具會掃描您的依賴項是否有已知漏洞。

2. 不安全的配置

問題:保留預設配置(尤其是在生產環境中)可能會將您的應用程式暴露給攻擊者。啟用詳細日誌記錄、開啟偵錯模式或允許所有來源使用 CORS 等操作可能會造成安全漏洞。

  • 環境特定配置:為開發和生產設定不同的配置。例如,停用偵錯模式並減少生產中的日誌記錄。
  • 環境變數:將敏感資訊(例如資料庫憑證、API 金鑰)保存在環境變數中,並使用 dotenv 等函式庫來安全地管理它們。
  • 使用 .env 檔案儲存敏感資料:切勿在程式碼庫中儲存憑證或敏感資料。使用 .env 文件,並且不要忘記將其新增至 .gitignore。

3. 注入攻擊(SQL/NoSQL 注入)

問題:當使用者輸入被錯誤處理並視為可執行程式碼或資料庫命令時,就會發生注入攻擊。例如,SQL 注入可以允許攻擊者操縱資料庫查詢並存取敏感資料。

  • 參數化查詢:與資料庫互動時始終使用參數化或準備好的語句。 PostgreSQL 的 pg 或 MongoDB 的 mongoose 等函式庫支援這些安全方法。
  • 清理使用者輸入:使用驗證器之類的庫來清理輸入,特別是在處理表單或其他使用者輸入來源時。

4. 跨站腳本(XSS)

問題:當攻擊者將惡意腳本注入您的應用程式時,就會發生 XSS 攻擊。例如,如果您的應用程式顯示使用者產生的內容而不對其進行清理,則攻擊者可以注入由其他使用者的瀏覽器執行的 JavaScript。

  • 轉義用戶輸入:確保前端顯示的任何用戶產生的內容都被轉義。這樣,它就被視為純文本,而不是可執行程式碼。
  • 內容安全策略 (CSP):CSP 可讓您定義允許在您的網站上執行哪些腳本、映像和樣式。這是限制 XSS 攻擊的有效方法。您可以在伺服器設定中設定 CSP 標頭。
  • 使用受信任的函式庫:如果您使用範本庫(例如 Handlebars、EJS),它們通常具有內建的轉義功能。不要禁用它們。

5. 跨站請求偽造(CSRF)

問題:CSRF 攻擊誘騙使用者在經過驗證的不同網站上執行不必要的操作。例如,登入其銀行帳戶的用戶可能會在不知情的情況下透過點擊惡意電子郵件中的連結將資金轉移到另一個帳戶。

  • 使用 CSRF 令牌:使用表單時,實作 CSRF 令牌來驗證每個請求是否合法。許多框架(例如 Express)都有 csurf 等中間件來幫助防止 CSRF 攻擊。
  • 雙重提交 Cookie:這是另一種方法,您在 cookie 中設定唯一令牌,並要求在請求負載中提交相同的令牌。
const express = require('express');
const csurf = require('csurf');
const cookieParser = require('cookie-parser');

const app = express();

// Use cookie parser and csrf middleware
app.use(cookieParser());
app.use(csurf({ cookie: true }));

// Middleware to add CSRF token to all responses
app.use((req, res, next) => {
  res.locals.csrfToken = req.csrfToken();
  next();
});

app.get('/form', (req, res) => {
  // Render a form with the CSRF token
  res.send(`
    <form action="/submit" method="POST">
      <input type="hidden" name="_csrf" value="${res.locals.csrfToken}">
      <input type="text" name="data">
      <button type="submit">Submit</button>
    </form>
  `);
});

app.post('/submit', (req, res) => {
  res.send('Data received securely!');
});

app.listen(3000, () => console.log('Server running on http://localhost:3000'));

登入後複製
登入後複製

6. 不安全的資料儲存

問題:在沒有加密或安全儲存方法的情況下儲存敏感資料(例如密碼或個人資訊)可能會使攻擊者在獲得存取權限後很容易竊取這些資料。

  • 加密敏感資料:對靜態敏感資料使用加密。例如,使用 bcrypt 等函式庫對密碼進行雜湊處理。
  • 對傳輸中的資料使用 HTTPS:透過強制 HTTPS 連線來加密傳輸中的資料。 Let’s Encrypt 等服務提供免費的 SSL 憑證來保護您的應用程式。
const express = require('express');
const csurf = require('csurf');
const cookieParser = require('cookie-parser');

const app = express();

// Use cookie parser and csrf middleware
app.use(cookieParser());
app.use(csurf({ cookie: true }));

// Middleware to add CSRF token to all responses
app.use((req, res, next) => {
  res.locals.csrfToken = req.csrfToken();
  next();
});

app.get('/form', (req, res) => {
  // Render a form with the CSRF token
  res.send(`
    <form action="/submit" method="POST">
      <input type="hidden" name="_csrf" value="${res.locals.csrfToken}">
      <input type="text" name="data">
      <button type="submit">Submit</button>
    </form>
  `);
});

app.post('/submit', (req, res) => {
  res.send('Data received securely!');
});

app.listen(3000, () => console.log('Server running on http://localhost:3000'));

登入後複製
登入後複製

7. 伺服器端漏洞

問題:由於 Node.js 在伺服器上運行,任何未處理的錯誤或不正確配置的伺服器設定都可能導致安全性問題。

  • 錯誤處理:始終優雅地處理錯誤,並避免在錯誤訊息中暴露敏感訊息。不要發送詳細的錯誤訊息,而是在生產中使用通用訊息。
  • 限制請求大小:大的有效負載可能會使您的伺服器超載,因此請使用 body-parser 等中間件限制請求正文大小,以防止拒絕服務 (DoS) 等攻擊。
  • 以非 root 使用者身分執行:避免以 root 權限執行應用程式。如果發生妥協,這可以幫助限制攻擊者可能造成的傷害。

最後的提示

保護 Node.js 和 JavaScript 應用程式需要時間,但這是必要的投資。以下是一些最後的快速提示:

  • 到處使用 HTTPS:加密傳輸中的資料對於保護使用者資料至關重要。
  • 避免 eval() 和類似函數:像 eval() 這樣的函數可以執行任意程式碼,使您的應用程式容易受到注入攻擊。盡可能避免使用它們。
  • 將依賴關係保持在最低限度:僅安裝您真正需要的軟體包。每個包都會引入一個潛在的漏洞,所以要有所選擇。

透過遵循這些提示並定期更新您的安全實務知識,您將能夠更好地保證 Node.js 應用程式的安全。安全性是一個持續的過程,但透過積極主動的方法,您可以顯著減少應用程式的漏洞足跡。


結論

儘管我們的目標是保護我們的程式碼,但事實是不存在完全安全應用程序,而且我們無法消除所有漏洞。新的漏洞會定期發現,函式庫會更新,我們的程式碼也會不斷發展。安全是一個持續的過程,需要保持警覺、持續更新和積極主動的逆向工程思維。

以下是一些持續提高程式碼安全性的其他方法:

  1. 定期審查代碼:進行程式碼審查,並專注於安全性。同儕審查有助於發現開發人員可能錯過的漏洞。

  2. 自動化安全測試:使用 CI/CD 管道進行自動化安全測試,以在開發早期發現問題。 GitHub Dependabot、Snyk 和 npmaudit 等工具可以整合到您的工作流程中以進行持續掃描。

  3. 隨時了解情況:安全威脅不斷發展,因此請隨時了解安全新聞、庫存和實踐。關注 OWASP 和 Node.js 安全團隊等社群可以讓您了解最新的威脅和緩解技術。

  4. 最小權限原則:限制應用程式和資料庫中的權限和存取等級。最小權限原則可確保應用程式的每個部分僅擁有其正常運作所需的存取權限,從而減少違規造成的潛在損害。

  5. 使用者教育:鼓勵安全實踐,特別是對於有權存取敏感程式碼和環境的團隊。開發人員安全訓練可以幫助避免導致漏洞的常見錯誤。

透過保持警覺和不斷學習,您將能夠更好地管理快節奏的 Node.js 生態系統中的安全風險。請記住:這是為了降低風險,而不是實現完美。祝您編碼愉快,應用程式更安全!

以上是如何消除 Node.js 應用程式中的漏洞:編寫安全 JavaScript 程式碼的指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板