」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 保護 Node.js 應用程式的指南

保護 Node.js 應用程式的指南

發佈於2024-11-11
瀏覽:848

A Guide for Securing Your Node.js Application

如今,应用程序安全至关重要。保护 Node.js 应用程序涉及多种防止数据泄露、未经授权的访问和其他漏洞的做法。本文探讨了保护 Node.js 应用程序的关键安全措施,包括 HTTPS、CORS、数据加密等。我们还将深入研究实际示例,向您展示如何有效地实施这些技术。

  1. 为什么安全性在 Web 应用程序中很重要
  2. 在 Node.js 应用程序中使用 HTTPS
  3. 了解 CORS(跨域资源共享)
  4. Node.js 中的数据加密
  5. 使用环境变量保护敏感数据
  6. 使用 JWT 进行身份验证和授权
  7. 实施速率限制以防止 DDoS 攻击[&​​&&]
  8. 真实用例:在 Node.js 中应用安全最佳实践
为什么安全性在 Web 应用程序中很重要

安全对于 Web 应用程序的保护至关重要:

  • 用户数据:保护登录凭据和个人数据等敏感信息。
  • 系统完整性:防止未经授权的访问、数据泄露和注入攻击。
  • 合规性:满足 GDPR、HIPAA 和 PCI-DSS 等行业标准。
在 Node.js 应用程序中使用 HTTPS

HTTPS(安全超文本传输​​协议)确保服务器和客户端之间传输的数据是加密的。以下是如何在 Node.js 应用程序中设置 HTTPS。

第1步:生成SSL证书

您可以使用

OpenSSL等工具生成SSL证书:

openssl req -nodes -new -x509 -keyout server.key -out server.cert
openssl req -nodes -new -x509 -keyout server.key -out server.cert
步骤 2:在 Node.js 中启用 HTTPS

在Node.js中使用

https模块:

const https = require('https'); const fs = require('fs'); const express = require('express'); 常量应用程序 = Express(); 常量选项 = { key: fs.readFileSync('server.key'), 证书: fs.readFileSync('server.cert') }; https.createServer(选项,应用程序).listen(3000, () => { console.log("HTTPS 服务器在端口 3000 上运行"); });
openssl req -nodes -new -x509 -keyout server.key -out server.cert
了解 CORS(跨源资源共享)

CORS 限制网页向除提供该网页的域以外的域发出请求。这有助于防止跨站请求伪造 (CSRF) 攻击。

在 Express 中实施 CORS

您可以使用 cors 包来设置 CORS 策略:


const cors = require('cors'); app.use(cors({ origin: 'https://trusted-domain.com' }));
openssl req -nodes -new -x509 -keyout server.key -out server.cert
Node.js 中的数据加密

在存储或传输敏感数据之前对其进行加密会增加额外的安全层。

Crypto是一个内置的Node.js模块,提供加密方法。

加密和解密数据

const crypto = require('crypto'); const 算法 = 'aes-256-cbc'; const key = crypto.randomBytes(32); const iv = crypto.randomBytes(16); 函数加密(文本){ 让 cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv); 让加密 = cipher.update(text); 加密 = Buffer.concat([加密, cipher.final()]); return { iv: iv.toString('hex'), 加密数据: 加密.toString('hex') }; } 函数解密(文本){ 让 iv = Buffer.from(text.iv, 'hex'); 让 cryptotext = Buffer.from(text.encryptedData, 'hex'); 让 decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv); 让解密 = decipher.update(encryptedText); 解密 = Buffer.concat([解密, decipher.final()]); 返回解密后的toString(); } // 用法示例 const 加密 = 加密("敏感数据"); console.log("已加密:", 已加密); console.log("解密:", 解密(加密));
openssl req -nodes -new -x509 -keyout server.key -out server.cert
使用环境变量保护敏感数据

在代码中存储 API 密钥和数据库凭据等敏感信息是有风险的。相反,请使用环境变量和库,例如

dotenv.

例子:

    安装dotenv:
npm 安装 dotenv
openssl req -nodes -new -x509 -keyout server.key -out server.cert
    将敏感数据添加到.env:
DB_USER=用户名 DB_PASS=密码
openssl req -nodes -new -x509 -keyout server.key -out server.cert
    访问代码中的变量:
require('dotenv').config(); const dbUser = process.env.DB_USER; const dbPass = process.env.DB_PASS;
openssl req -nodes -new -x509 -keyout server.key -out server.cert
使用 JWT 进行身份验证和授权

JWT(JSON Web Token)是一种在各方之间传输信息的紧凑且安全的方式。它通常用于 API 中的无状态身份验证。

设置 JWT 身份验证

    安装
  1. jsonwebtoken
npm 安装 jsonwebtoken
openssl req -nodes -new -x509 -keyout server.key -out server.cert
    创建并验证 JWT:
const jwt = require('jsonwebtoken'); // 生成 JWT 函数generateToken(用户){ return jwt.sign(user, process.env.JWT_SECRET, { expiresIn: '1h' }); } // 验证 JWT 函数验证令牌(令牌){ 返回 jwt.verify(token, process.env.JWT_SECRET); } // 用法 const token =generateToken({ id: 1, 用户名: 'user1' }); console.log("令牌:", 令牌); 尝试 { const 解码 = verifyToken(令牌); console.log("解码后的令牌:", 已解码); } 捕获(错误){ console.error("无效的令牌"); }
openssl req -nodes -new -x509 -keyout server.key -out server.cert
实施速率限制以防止 DDoS 攻击

速率限制限制用户在一段时间内可以发出的请求数量,从而减轻 DDoS 攻击。

使用 Express 速率限制器

const ratesLimit = require('express-rate-limit'); 常量限制器=rateLimit({ windowMs: 15 * 60 * 1000, // 15 分钟 max: 100 // 将每个 IP 限制为每个窗口 100 个请求 }); app.use(限制器);
openssl req -nodes -new -x509 -keyout server.key -out server.cert
真实用例:在 Node.js 中应用安全最佳实践

考虑一个安全性至关重要的在线银行应用程序。以下是如何实施我们讨论过的实践:

  1. HTTPS:加密所有客户端-服务器通信以保护敏感数据。
  2. CORS:限制来自受信任域的请求以减轻 CSRF。
  3. 加密:加密个人数据等敏感信息。
  4. 环境变量:安全地存储所有凭据和敏感信息。
  5. JWT 身份验证:颁发 JWT 令牌以进行安全、无状态身份验证。
  6. 速率限制:通过限制请求来保护端点免受 DDoS 攻击。
通过实施这些最佳实践,您可以确保您的应用程序保持安全,免受常见威胁。

结论

保护 Node.js 应用程序是一个持续的过程。所涵盖的技术(使用 HTTPS、设置 CORS、加密数据、使用环境变量、实施 JWT 身份验证和添加速率限制)对于保护您的应用程序免遭未经授权的访问和数据泄露至关重要。通过合并这些方法,您可以为 Node.js 应用程序创建强大的安全基础。

版本聲明 本文轉載於:https://dev.to/imsushant12/a-guide-for-securing-your-nodejs-application-42cj?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 為什麼我的 Python MySQL 插入功能不起作用?
    為什麼我的 Python MySQL 插入功能不起作用?
    Python MySQL 插入不起作用在 Python 中,利用 MySQL API 連接到 MySQL 資料庫是一種流行的方法。但是,嘗試將記錄插入資料庫時可能會出現困難。 遇到的一個此類問題是無法插入記錄。經檢查,插入操作涉及的程式碼如下:db = MySQLdb.connect("l...
    程式設計 發佈於2024-11-18
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-18
  • 修正「無法在模組外部使用導入語句」錯誤
    修正「無法在模組外部使用導入語句」錯誤
    作为 JavaScript 和 TypeScript 开发人员,我们在使用不同的模块系统时经常会遇到意外的错误。一个常见问题是“无法在模块外部使用 import 语句”错误。它通常在使用现代 ES 模块 (ESM) 或处理涉及 Webpack、Babel 或 Node.js 环境等捆绑程序的设置时出...
    程式設計 發佈於2024-11-18
  • 如何從本機主機連線到 Docker MySQL 容器?
    如何從本機主機連線到 Docker MySQL 容器?
    從本地主機連接到Docker MySQL 容器要直接從主機與Docker 容器中運行的MySQL 實例進行交互,請按照以下步驟操作步驟:使用docker-compose up由於您已經在Docker 主機上發布了連接埠3306,因此您可以從主機本身連接到它:$> mysql -h 127.0....
    程式設計 發佈於2024-11-18
  • 如何在具有不同範本參數的範本類別中定義好友關係?
    如何在具有不同範本參數的範本類別中定義好友關係?
    深入研究類別範本與Template Class Friends 深入研究類別範本與Template Class Friends定義二元樹類別(BT)及其元素類別(BE)時,BT 存取BE私人會員需要建立好友關係。然而,理解正確定義關係的底層機制至關重要。 最初,您嘗試將好友關係宣告為 templat...
    程式設計 發佈於2024-11-18
  • ## 建立強大的 CMS 後端:OOP 和 MVC 結構如何增強專案管理?
    ## 建立強大的 CMS 後端:OOP 和 MVC 結構如何增強專案管理?
    PHP OOP 核心架構:為CMS 後端實現堅實的基礎了解物件導向程式設計(OOP) 在開發時至關重要可靠的CMS 後端框架。結構良好的框架應遵循 OOP 原則並採用 MVC 設計來提高效率。 管理單一專案頁面上的多個部分處理一個專案上的多個部分時專案頁面,考慮使用不同的方法來管理每個部分。例如,索...
    程式設計 發佈於2024-11-18
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-18
  • std::string 是如何實現的以及它與 C 風格字串有何不同?
    std::string 是如何實現的以及它與 C 風格字串有何不同?
    對std::string 實現的探索對std::string 實現的探索神秘的std::string,C 標準庫的基本組件,引發了人們的關注對它的內部運作方式感到好奇。在本文中,我們深入研究其實現,揭示其複雜性,並將其與其前身、無處不在的 C 風格字串區分開來。 各種編譯器工具鏈提供對各自 std ...
    程式設計 發佈於2024-11-18
  • 為什麼 JavaScript 中 (0 < 5 < 3) 的計算結果為 true?
    為什麼 JavaScript 中 (0 < 5 < 3) 的計算結果為 true?
    JavaScript 的比較難題:破解(0 < 5 < 3) 中的真相在JavaScript 領域,出現了一個奇特的觀察結果:為什麼表達式(0 < 5 < 3) 的計算結果為true?這種神秘的行為源自於語言的求值規則,稱為操作順序。 要解開這個謎團,我們必須深入研究表達式執行的操作順序:Paren...
    程式設計 發佈於2024-11-18
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST數組:表單提交後使用var_dump檢查$_POST 陣列的內容。...
    程式設計 發佈於2024-11-18
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-18
  • 如何使用 mitmproxy 修復 Windows 上的「pip install Access Denied」錯誤?
    如何使用 mitmproxy 修復 Windows 上的「pip install Access Denied」錯誤?
    使用mitmproxy 解決Windows 上的「pip install Access Denied」錯誤當嘗試使用pip 在Windows 上安裝mitmproxy 時,使用者可能會遇到儘管以管理員身分執行cmd 或PowerShell,但仍出現「存取被拒絕」錯誤。此錯誤通常在嘗試安裝 crypt...
    程式設計 發佈於2024-11-18
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-18
  • 如何從針對 Go 二進位檔案的整合測試中擷取程式碼覆蓋率?
    如何從針對 Go 二進位檔案的整合測試中擷取程式碼覆蓋率?
    從 Go 二進位檔案擷取程式碼覆蓋率執行單元測試時,擷取程式碼覆蓋率非常簡單。然而,在針對二進位檔案本身的整合測試期間收集覆蓋率指標可能具有挑戰性。有沒有辦法克服這個障礙? 整合測試覆蓋率的需求整合測試提供了比單獨的單元測試更全面的程式碼覆蓋率視圖。透過針對真實世界的輸入運行二進位文件,我們可以評估...
    程式設計 發佈於2024-11-18
  • 如何從終端機將資料庫匯入MySQL?
    如何從終端機將資料庫匯入MySQL?
    從終端導入MySQL資料庫使用終端將資料庫導入MySQL可以提供一種便捷的資料管理方式。要有效地執行此任務,請按照下列步驟操作:使用命令列,您可以存取 MySQL 提示符。這樣做的語法是:mysql -u username -p database_name輸入您的使用者名稱、密碼和目標資料庫名稱來取...
    程式設計 發佈於2024-11-18

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3