自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

保護(hù)生產(chǎn)中 Node.js 應(yīng)用程序安全的 15 項(xiàng)最佳實(shí)踐

開發(fā) 前端
在本指南中,我們討論了在生產(chǎn)中保護(hù) Node.js 應(yīng)用程序安全的方法。作為開發(fā)人員,我們有責(zé)任保護(hù)用戶數(shù)據(jù)、維護(hù)應(yīng)用程序功能并保護(hù)我們的聲譽(yù)。

在后端開發(fā)方面,Node.js 是開發(fā)人員最喜歡的技術(shù)之一。它的受歡迎程度不斷上升,現(xiàn)已成為在線攻擊的主要目標(biāo)之一。這就是為什么保護(hù) Node.js 免受漏洞和威脅至關(guān)重要。

在本指南中,您將看到為生產(chǎn)設(shè)計(jì)安全 Node.js 應(yīng)用程序架構(gòu)的 15 種最佳實(shí)踐。實(shí)施所有這些實(shí)踐,讓您的后端比以往任何時(shí)候都更安全!

為什么應(yīng)該構(gòu)建安全的 Node.js 應(yīng)用程序?

構(gòu)建安全的 Node.js 應(yīng)用程序非常重要,至少有以下三個(gè)原因:

  1. 保護(hù)用戶數(shù)據(jù):您的應(yīng)用程序可能會(huì)處理敏感的用戶信息,如個(gè)人信息、登錄憑證、支付數(shù)據(jù)或機(jī)密的業(yè)務(wù)見解。如果不能保護(hù)這些數(shù)據(jù),您可能會(huì)被隱私監(jiān)管機(jī)構(gòu)處以數(shù)百萬美元的罰款。通過實(shí)施強(qiáng)大的安全措施,您可以保護(hù)用戶數(shù)據(jù)并避免法律問題。
  2. 保護(hù)應(yīng)用程序功能:安全漏洞可能會(huì)損害后端提供的功能。攻擊者可能會(huì)利用弱點(diǎn)來改變您的服務(wù)、操縱數(shù)據(jù)或注入惡意代碼。通過保護(hù)您的應(yīng)用程序,您可以避免這種情況,并為您的用戶提供無縫的體驗(yàn)。
  3. 維護(hù)聲譽(yù):安全事件可能會(huì)嚴(yán)重?fù)p害您的聲譽(yù)并削弱對(duì)您服務(wù)的信任??蛻艉陀脩粝M麄兊臄?shù)據(jù)得到安全處理,并且您的應(yīng)用程序能夠按預(yù)期運(yùn)行。違規(guī)可能會(huì)導(dǎo)致失去信任,但通過優(yōu)先考慮安全性,您可以表明您對(duì)質(zhì)量的承諾。

您可能認(rèn)為安全問題并沒有那么普遍,遵循編碼和架構(gòu)最佳實(shí)踐就足夠了,但事實(shí)并非如此。Node.js 的強(qiáng)大之處在于 NPM 環(huán)境,它提供了數(shù)百萬個(gè)庫。問題是大多數(shù) NPM 包都存在一些安全漏洞。

換句話說,如果 Node.js 項(xiàng)目的依賴項(xiàng)不安全,那么它就不安全??紤]到使用外部庫的流行程度,這是令人擔(dān)憂的。根據(jù) Snyk 開源安全狀況報(bào)告,平均一個(gè) Node.js 項(xiàng)目在 79 個(gè)直接依賴項(xiàng)中存在 49 個(gè)漏洞。這一相關(guān)統(tǒng)計(jì)數(shù)據(jù)強(qiáng)調(diào)了保護(hù) Node.js 應(yīng)用程序的重要性。

讓 Node.js 應(yīng)用程序更安全的 15 個(gè)最佳實(shí)踐

1.切勿使用 Root 權(quán)限運(yùn)行 Node.js

不建議使用 root 權(quán)限運(yùn)行 Node.js,因?yàn)檫@違反了最小權(quán)限原則。無論您的后端是在專用服務(wù)器還是 Docker 容器上,您都應(yīng)該始終以非 root 用戶身份啟動(dòng)它。

如果您使用 root 權(quán)限運(yùn)行 Node.js,則項(xiàng)目或其依賴項(xiàng)中的任何漏洞都可能被利用來獲得對(duì)系統(tǒng)的未經(jīng)授權(quán)的訪問。例如,攻擊者可以利用它們執(zhí)行任意代碼、訪問敏感文件,甚至控制整個(gè)機(jī)器。因此,必須避免使用 Node.js 的 root 用戶。

這里的最佳實(shí)踐是創(chuàng)建一個(gè)專門的用戶來運(yùn)行 Node.js。該用戶應(yīng)僅具有啟動(dòng)應(yīng)用程序所需的權(quán)限。這樣,成功破壞您后端的攻擊者將被限制為該用戶的權(quán)限,從而限制了他們可能造成的潛在損害。

2.讓你的 NPM 庫保持最新

NPM 庫使構(gòu)建功能齊全的 Node.js 后端變得更容易、更快捷。同時(shí),它們還會(huì)給您的應(yīng)用程序帶來安全風(fēng)險(xiǎn)。新的漏洞一直在被發(fā)現(xiàn),維護(hù)人員的工作就是解決這些漏洞并發(fā)布軟件包的更新版本。這就是為什么您應(yīng)該保持依賴項(xiàng)最新的原因。

為了確保您所依賴的 NPM 庫的安全,您可以使用 npm audit[1] 和 snyk[2] 。這些工具分析項(xiàng)目的依賴關(guān)系樹并提供對(duì)任何已知漏洞的見解。

這是運(yùn)行 npm audit 的示例:

npm audit
...
found 4 vulnerabilities (2 low, 2 moderate)
run `npm audit fix` to fix them, or `npm audit` for details

此命令利用 GitHub Advisory 數(shù)據(jù)庫[3]并檢查您的 package.json 和 package-lock.json 是否存在已知安全問題。

此外,您可以使用 Snyk 檢查您對(duì) Snyk 開源漏洞數(shù)據(jù)庫的依賴關(guān)系。安裝 snyk :

npm install -g snyk

在項(xiàng)目的根文件夾中,使用以下命令測(cè)試您的應(yīng)用程序:

snyk test

要打開一個(gè)向?qū)硪龑?dǎo)您完成修補(bǔ)所發(fā)現(xiàn)的漏洞的過程,請(qǐng)運(yùn)行:

snyk wizard

使用 snyk 并定期運(yùn)行 npm audit 可幫助您在 NPM 庫中的安全問題成為問題之前識(shí)別并修復(fù)它們。請(qǐng)記住,應(yīng)用程序的安全性取決于依賴項(xiàng)中最薄弱的環(huán)節(jié)。

3.避免使用默認(rèn)的 Cookie 名稱

Node.js 應(yīng)用程序使用的 cookie 名稱可能會(huì)無意中泄露您的后端所基于的技術(shù)堆棧。這是有價(jià)值的信息,您應(yīng)該始終隱藏它,因?yàn)楣粽呖梢栽俅问褂盟Mㄟ^了解您正在使用的框架,他們可以利用與其相關(guān)的特定弱點(diǎn)。

詳細(xì)而言,攻擊者往往將注意力集中在會(huì)話 cookie 的名稱上。通過使用 express-session[4] 中間件設(shè)置自定義會(huì)話 cookie 名稱來保護(hù)您的應(yīng)用程序免受此類影響:

const express = require("express");
const session = require("express-session");

const app = express();
app.use(
  session({
    // set a custom name for the session cookie
    name: "myCustomCookieName",
    // a secure secret key for session encryption
    secret: "mySecretKey",
  })
);

4.設(shè)置安全 HTTP 標(biāo)頭

Express 中默認(rèn)的 HTTP 標(biāo)頭不是很安全。我們使用在線 Security Headers 項(xiàng)目[5]檢查標(biāo)頭安全性:

圖片圖片

其中一些標(biāo)頭包含不應(yīng)公開的信息,如 X-Powered-By。還有一些則是缺失的,應(yīng)該添加進(jìn)來,以處理各種與安全相關(guān)的問題,包括防止跨站腳本 (XSS) 攻擊。

這就是 helmet[6] 發(fā)揮作用的地方!該庫負(fù)責(zé)根據(jù)安全標(biāo)頭的建議設(shè)置最重要的安全標(biāo)頭。使用方法如下:

const express = require("express");
const helmet = require("helmet");

const app = express();
// register the helmet middleware
// to set the security headers
app.use(helmet());

helmet() 中間件會(huì)自動(dòng)刪除不安全的標(biāo)頭并添加新的標(biāo)頭,包括 X-XSS-Protection 、 X-Content-Type-Options 、 Strict-Transport-Security 和 X-Frame-Options。這些都是最佳實(shí)踐,有助于保護(hù)您的應(yīng)用程序免受常見攻擊。

Node.js 應(yīng)用程序設(shè)置的標(biāo)頭現(xiàn)在將被視為安全:

圖片圖片

5.實(shí)施速率限制

DDoS(分布式拒絕服務(wù))和暴力破解是兩種最常見的 Web 攻擊。為了緩解它們,您可以實(shí)施速率限制。此技術(shù)涉及控制 Node.js 后端的傳入流量,防止惡意行為者用過多的請(qǐng)求淹沒您的服務(wù)器。

實(shí)施速率限制的最簡單方法是通過 rate-limiter-flexible[7] 庫。該依賴庫提供了一個(gè)可配置的中間件,用于限制在指定時(shí)間內(nèi)來自同一 IP 地址或用戶的請(qǐng)求數(shù)量。

以下是如何使用它在 Node.js 中應(yīng)用速率限制的示例:

const express = require("express");
const {
  RateLimiterMemory,
} = require("rate-limiter-flexible");

const app = express();
const rateLimiter = new RateLimiterMemory({
  points: 10, // 允許的最大請(qǐng)求數(shù)
  duration: 1, // 時(shí)間范圍,以秒為單位
});
const rateLimiterMiddleware = (req, res, next) => {
  rateLimiter
    .consume(req.ip)
    .then(() => {
      // 請(qǐng)求被允許,繼續(xù)處理請(qǐng)求
      next();
    })
    .catch(() => {
      //超過請(qǐng)求限制,使用適當(dāng)?shù)腻e(cuò)誤消息進(jìn)行響應(yīng)
      res.status(429).send("Too Many Requests");
    });
};
app.use(rateLimiterMiddleware);

首先,初始化一個(gè)速率限制器實(shí)例,允許 1 秒內(nèi)最多 10 個(gè)請(qǐng)求。然后,在自定義中間件中使用它來分析傳入請(qǐng)求的 IP。如果未超出速率限制,則請(qǐng)求將繼續(xù)。否則,請(qǐng)求將被阻止并且服務(wù)器返回 429 Too Many Requests 響應(yīng)。

6.確保強(qiáng)大的身份驗(yàn)證策略

為了保護(hù)您的 Node.js 應(yīng)用程序免受利用用戶身份驗(yàn)證的攻擊,您需要實(shí)施強(qiáng)身份驗(yàn)證策略。首先,邀請(qǐng)用戶設(shè)置強(qiáng)密碼。此外,您還應(yīng)該支持多重身份驗(yàn)證[8] (MFA) 和單點(diǎn)登錄[9] (SSO)。MFA 通過要求用戶提供多種形式的身份驗(yàn)證來增加額外的安全層,而 SSO 則簡化了身份驗(yàn)證過程并降低了弱密碼或重復(fù)使用密碼的風(fēng)險(xiǎn)。

當(dāng)需要對(duì)密碼進(jìn)行散列存儲(chǔ)時(shí),應(yīng)首選 bcrypt[10] 等強(qiáng)大的加密函數(shù),而不是 Node.js crypto 庫提供的方法。該軟件包提供了一種安全的密碼散列算法,大大增加了攻擊者破解密碼的難度。最后,如前所述,通過限制登錄失敗次數(shù)來減少暴力破解攻擊。

7.不要發(fā)送不必要的信息

無意中提供給攻擊者的任何信息都可能被用來對(duì)付你。因此,服務(wù)器響應(yīng)只應(yīng)包含調(diào)用者嚴(yán)格需要的內(nèi)容。例如,避免直接向客戶端返回詳細(xì)的錯(cuò)誤信息或堆棧跟蹤。取而代之的是,提供不透露具體實(shí)現(xiàn)細(xì)節(jié)的通用錯(cuò)誤信息。最簡單的方法是在生產(chǎn)模式下運(yùn)行 Node.js,設(shè)置 NODE_ENV=production env,否則 Express 會(huì)在錯(cuò)誤響應(yīng)中添加堆棧跟蹤。

同樣,您必須小心 API 響應(yīng)中包含的數(shù)據(jù)。僅返回必要的數(shù)據(jù)字段,并避免暴露調(diào)用者未請(qǐng)求的敏感信息。這將最大限度地減少意外泄露機(jī)密或特權(quán)信息的風(fēng)險(xiǎn)。

8.監(jiān)控你的后端

您在生產(chǎn)中的后端可能正在遭受攻擊,而您可能根本沒有意識(shí)到這一點(diǎn)。這就是監(jiān)控 Node.js 應(yīng)用程序至關(guān)重要的原因。通過將其連接到應(yīng)用程序性能監(jiān)控[11] (APM) 工具,您可以對(duì)其進(jìn)行跟蹤,以發(fā)現(xiàn)安全問題并確保其整體健康。

幸運(yùn)的是,有幾個(gè)可用于 Node.js 的 APM 庫和服務(wù)。其中最受歡迎的一些是 SigNoz[12]、Sentry[13]、Prometheus[14]、New Relic[15] 和 Elastic[16],它們提供了應(yīng)用程序各個(gè)方面的信息,包括性能、錯(cuò)誤率、資源使用情況和安全相關(guān)指標(biāo)。特別是,它們可以實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)收集和檢測(cè)可能表明安全漏洞的異?;蚩梢苫顒?dòng)。其中一些還提供可維護(hù)性功能,以跟蹤 CI/CD 管道中的部署工作流程。

9.采用僅 HTTPS 的策略

通過確保只能通過 HTTPS 訪問后端,您將提高客戶端和 Node.js 服務(wù)器之間交換數(shù)據(jù)的機(jī)密性。HTTPS 建立一個(gè)加密通道,保護(hù)密碼、會(huì)話令牌和用戶數(shù)據(jù)等敏感信息免遭攔截。

作為此類政策的一部分,您還應(yīng)該使用 HTTPS cookie。為此,請(qǐng)確保 Node.js 應(yīng)用程序設(shè)置的任何 cookie 都標(biāo)記為 secure 和 httpOnly:

res.cookie("myCookie", "cookieValue", {
  // create an HTTPS cookie
  secure: true,
  httpOnly: true,
});

意外方或腳本將無法再訪問您的 cookie。此外,它們只能通過 HTTPS 連接傳輸。

10.驗(yàn)證用戶輸入

每當(dāng)用戶有機(jī)會(huì)輸入內(nèi)容時(shí),攻擊者就可以利用它向服務(wù)器發(fā)送惡意數(shù)據(jù)。因此,驗(yàn)證用戶輸入對(duì)于確保 Node.js 應(yīng)用程序的安全性和完整性至關(guān)重要。

11.使用安全檢查器

安全檢查器會(huì)分析您的代碼庫,以識(shí)別漏洞、不安全的代碼部分和最佳實(shí)踐違規(guī)行為。其中最流行的是 eslint-plugin-security[17] ,這是一組用于在 Node.js 中實(shí)施安全開發(fā)的 ESLint 規(guī)則。

通過將此類工具集成到您的開發(fā)工作流程中,您可以及早發(fā)現(xiàn)并解決安全問題。具體來說,它們可以降低編碼時(shí)將漏洞引入應(yīng)用程序的風(fēng)險(xiǎn)。這些工具在集成到 CI/CD 管道中時(shí)特別有效。

12.防止 SQL 注入

SQL 注入是一種常見的安全漏洞,當(dāng)攻擊者可以操縱傳遞到 SQL 查詢的輸入數(shù)據(jù)時(shí)就會(huì)發(fā)生這種漏洞。當(dāng)將用戶輸入直接連接到 SQL 查詢中時(shí),通常會(huì)發(fā)生這種情況。在這種情況下,攻擊者可以偽造旨在執(zhí)行任意 SQL 代碼的特定輸入,從而導(dǎo)致未經(jīng)授權(quán)的訪問和數(shù)據(jù)泄露。

有多種方法可以防止 Node.js 中的 SQL 注入。最流行的是:

  • 使用準(zhǔn)備好的語句或參數(shù)化查詢:這些技術(shù)涉及將 SQL 代碼與用戶輸入分離,防止其被解釋為查詢的一部分。
  • 輸入清理:驗(yàn)證用戶輸入以拒絕惡意數(shù)據(jù),降低 SQL 注入攻擊的風(fēng)險(xiǎn)。
  • 使用 ORM:像 Sequelize 這樣的 ORM 技術(shù)通常提供針對(duì) SQL 注入的內(nèi)置保護(hù)。

13.限制請(qǐng)求大小

Node.js 中的默認(rèn)請(qǐng)求正文大小限制為 5 MB。為了保護(hù)您的后端免受惡意用戶試圖用數(shù)據(jù)淹沒您的服務(wù)器的 DDoS 攻擊,建議減少該限制。為此,您可以使用 body-parser[18] 庫并按如下方式配置它:

const express = require("express");
const bodyParser = require("body-parser");

const app = express();
// 將請(qǐng)求大小限制設(shè)置為1 MB
app.use(bodyParser.json({ limit: "1mb" }));

請(qǐng)根據(jù)您的具體要求調(diào)整該值?,F(xiàn)在,正文大于 1 MB 的請(qǐng)求將立即被阻止,服務(wù)器將無法分配資源來處理這些請(qǐng)求。

14.通過自動(dòng)化工具檢測(cè)漏洞

自動(dòng)漏洞掃描工具(例如 SonarQube 或類似工具)是識(shí)別 Node.js 應(yīng)用程序中安全問題的寶貴資源。這些工具對(duì)代碼庫、依賴項(xiàng)、配置和其他組件執(zhí)行全面掃描,以識(shí)別安全漏洞。

以下是使用自動(dòng)漏洞掃描器的一些主要好處:

  • 早期檢測(cè):在部署應(yīng)用程序之前主動(dòng)識(shí)別安全問題。
  • 增加覆蓋范圍:對(duì)所有項(xiàng)目文件進(jìn)行深度掃描,確保高安全覆蓋范圍。
  • 持續(xù)監(jiān)控:將它們集成到 CI/CD 管道中,以確保及時(shí)發(fā)現(xiàn)通過代碼更改引入的任何新漏洞。

15.讓漏洞報(bào)告更簡單

讓用戶和安全研究人員能夠報(bào)告 Node.js 后端中發(fā)現(xiàn)的漏洞是確保應(yīng)用程序安全的另一個(gè)重要方面。這不僅應(yīng)該是可能的,而且程序必須清晰且易于理解。

security.txt[19] 提議的標(biāo)準(zhǔn)是讓研究人員與您聯(lián)系的有效方法。這是一個(gè)放置在項(xiàng)目根目錄下的簡單文本文件,提供有關(guān)如何報(bào)告安全漏洞的信息。它遵循標(biāo)準(zhǔn)化格式,包括聯(lián)系方式、加密方法和披露指南。

以下是基本 security.txt 文件的示例:

Contact: email@example.com
Encryption: https://example.com/pgp-key.asc

Contact 指定應(yīng)向其報(bào)告安全漏洞或問題的電子郵件地址。這些電子郵件可能包含關(guān)鍵信息,不應(yīng)公開訪問。因此, Encryption 字段指示組織的 PGP 公鑰的位置,該公鑰可用于加密電子郵件內(nèi)的消息。這種機(jī)制確保只有組織才能使用私鑰解密這些消息并讀取它們。

同樣,您也可以考慮在網(wǎng)站上添加“報(bào)告漏洞”頁面。

結(jié)論

在本指南中,我們討論了在生產(chǎn)中保護(hù) Node.js 應(yīng)用程序安全的方法。作為開發(fā)人員,我們有責(zé)任保護(hù)用戶數(shù)據(jù)、維護(hù)應(yīng)用程序功能并保護(hù)我們的聲譽(yù)。

通過集成這些技術(shù)、方法和技巧,您可以創(chuàng)建更可靠的 Node.js 架構(gòu),降低風(fēng)險(xiǎn)并確保應(yīng)用程序的安全性。

原文:https://semaphoreci.medium.com/best-practices-for-securing-node-js-applications-in-production-d24b7c4981d

最近文章

  • RDB.js:適用于 Node.js 和 Typescript 的終極對(duì)象關(guān)系映射器
  • 如何讓你的Node.js應(yīng)用程序處理數(shù)百萬的API請(qǐng)求
  • UI 設(shè)計(jì)通識(shí):通過 60-30-10 規(guī)則增強(qiáng)美感
  • NativeScript 與 Flutter:移動(dòng)應(yīng)用程序開發(fā)孰優(yōu)孰劣?
  • 我的過山車之旅:從0美元到3萬美元,然后再回到0美元
  • 15個(gè)快速且易于實(shí)施的 SaaS 創(chuàng)意
  • 將Flutter推向極限:你應(yīng)該知道的44個(gè)性能提示
  • Spaces SDK:專為實(shí)時(shí)協(xié)作功能開發(fā)設(shè)計(jì)的SDK

參考資料

[1]npm audit: https://docs.npmjs.com/cli/v9/commands/npm-auditnpm 審核:https://docs.npmjs.com/cli/v9/commands/npm-audit

[2]snyk: https://www.npmjs.com/package/snyk

[3]GitHub Advisory 數(shù)據(jù)庫: https://github.com/advisoriesGitHub 咨詢數(shù)據(jù)庫:https://github.com/advisories

[4]express-session: https://www.npmjs.com/package/express-session

[5]Security Headers 項(xiàng)目: https://securityheaders.com/安全標(biāo)頭項(xiàng)目:https://securityheaders.com/

[6]helmet: https://www.npmjs.com/package/helmet

[7]rate-limiter-flexible: https://www.npmjs.com/package/rate-limiter-flexible

[8]多重身份驗(yàn)證: https://en.wikipedia.org/wiki/Multi-factor_authentication多重身份驗(yàn)證:https://en.wikipedia.org/wiki/Multi-factor_authentication

[9]單點(diǎn)登錄: https://en.wikipedia.org/wiki/Single_sign-on單點(diǎn)登錄:https://en.wikipedia.org/wiki/Single_sign-on

[10]bcrypt: https://www.npmjs.com/package/bcrypt

[11]應(yīng)用程序性能監(jiān)控: https://en.wikipedia.org/wiki/Application_performance_management應(yīng)用程序性能監(jiān)控:https://en.wikipedia.org/wiki/Application_performance_management

[12]SigNoz: https://github.com/SigNoz/signoz

[13]Sentry: https://github.com/getsentry/sentry-javascript

[14]Prometheus: https://github.com/prometheus/prometheus

[15]New Relic: https://github.com/newrelic/node-newrelic新遺跡:https://github.com/newrelic/node-newrelic

[16]Elastic: https://github.com/elastic/apm-agent-nodejs

[17]eslint-plugin-security: https://www.npmjs.com/package/eslint-plugin-security

[18]body-parser: https://www.npmjs.com/package/body-parser

[19]security.txt: https://en.wikipedia.org/wiki/Security.txt

責(zé)任編輯:武曉燕 來源: 獨(dú)立開發(fā)者張張
相關(guān)推薦

2022-09-12 16:02:32

Docker安全Node.js

2013-05-17 09:41:02

Node.js云應(yīng)用開發(fā)IaaS

2016-01-06 11:00:18

2015-11-20 17:09:36

jsWeb應(yīng)用程序

2023-03-07 14:31:44

Node.jsPython應(yīng)用程序

2020-09-04 15:06:04

Docker容器化Node.js

2020-01-15 14:20:07

Node.js應(yīng)用程序javascript

2022-12-14 14:40:27

Node.js開發(fā)應(yīng)用程序

2025-03-19 09:04:39

2010-03-09 13:27:23

Web 2.0應(yīng)用程序

2017-03-06 13:20:31

2024-03-22 11:40:40

Node.jsNodeCRUD

2022-05-09 17:33:23

PWA漸進(jìn)式Web應(yīng)用程序離線優(yōu)先

2020-08-25 14:03:20

應(yīng)用程序屏蔽應(yīng)用程序內(nèi)保護(hù)網(wǎng)絡(luò)攻擊

2012-09-17 11:26:14

IBMdw

2023-03-24 15:57:31

Node.js應(yīng)用程序容器

2023-06-16 15:14:57

Node.js容器化開發(fā)

2013-12-17 14:07:37

2015-12-01 11:04:02

移動(dòng)·開發(fā)技術(shù)周刊

2016-08-11 14:02:02

NodeJS前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)