用的 Web 安全防護、CSRF 與 XSS 過濾實戰(zhàn))
后端Web框架【免費下載鏈接】egg Born to build better enterprise frameworks and apps with Node.js Koa. https://307.run/eggcode項目地址https://gitcode.com/gh_mirrors/eg/egg點擊查看免費下載eggjs/security是 Egg 框架內(nèi)置的 Web 安全插件默認開啟、零配置即可為應(yīng)用提供 CSRF/CTOKEN 防跨站、安全重定向、XSS 過濾 Helper、Web 安全響應(yīng)頭與 HTTP 方法限制等一整套防護能力。本文以 plugins/security/README.zh-CN.md 為骨架結(jié)合插件源碼逐項拆解每一項防護的配置方式、底層實現(xiàn)原理與適用場景幫助你理解安全插件到底做了什么并能按業(yè)務(wù)需要精準地開啟、關(guān)閉或裁剪某一項安全策略。一、插件定位與快速上手eggjs/security位于倉庫 plugins/security 目錄是 Egg 默認加載的安全插件因此絕大多數(shù)場景下無需任何配置即可生效。在 Egg 應(yīng)用中你可以直接修改config/config.js或 TypeScript 項目中的config/config.default.ts來調(diào)整其行為exports.security { xframe: { value: SAMEORIGIN, }, };1.1 關(guān)閉某項安全防范安全插件默認啟用一套完整的防護集合。如果某項防護與你的業(yè)務(wù)沖突例如需要被第三方以 iframe 嵌入頁面而關(guān)閉xframe只需將該配置項的enable設(shè)為falseexports.security { xframe: { enable: false, }, };從源碼 plugins/security/src/app/middleware/securities.ts 可以看出插件啟動時會把各項安全中間件 compose 成一個統(tǒng)一的security中間件其中每一項若enable false都會被直接跳過。同時源碼也給出了一個兼容性提示老版本可能使用config.security.xframe false這種寫法當前版本會打印警告推薦一律使用{ enable: false }的對象形式。1.2 match 與 ignore按路徑精準控制安全插件的每一項子配置都支持match與ignore兩個路由匹配選項取值可以是字符串路徑、正則表達式、函數(shù)或它們的數(shù)組。例如只對/example路徑開啟 CSPexports.security { csp: { match: /example, // match: /^\/api/, // support regexp // match: ctx ctx.path.startsWith(/api), // support function // match: [ ctx ctx.path.startsWith(/api), /^\/foo$/, /bar], // support Array policy: { //... }, }, };再如忽略/example路徑上的xframe防護以便合作商戶能夠嵌入本頁面exports.security { xframe: { ignore: /example, // ignore: /^\/api/, // support regexp // ignore: ctx ctx.path.startsWith(/api), // support function // ignore: [ ctx ctx.path.startsWith(/api), /^\/foo$/, /bar], // support Array // ... }, };注意如果同時配置了match和ignore以match為準ignore會被忽略。這一邏輯在源碼 plugins/security/src/app/middleware/securities.ts 中有明確實現(xiàn)二者同時存在時輸出 warning 并清空ignore。另外頂層config.security.match/config.security.ignore已不推薦使用源碼會提示請在各項子配置上設(shè)置。從實現(xiàn)上看每項配置最終都會通過pathMatching(opt)來自eggjs/path-matching包編譯成匹配函數(shù)注入到對應(yīng)中間件選項中中間件通過checkIfIgnore(opts, ctx)判斷當前請求是否命中放行條件見 plugins/security/src/lib/utils.ts。二、全局配置模型默認開啟哪些中間件安全插件的全部配置項定義在 plugins/security/src/config/config.default.ts使用 zod 做運行時校驗并給出默認值。最核心的兩個全局配置是domainWhiteList安全域名白名單默認[]用于安全重定向、shtml的 href/src 域名校驗等場景protocolWhiteList協(xié)議白名單默認[]會與內(nèi)置的http、https、file、data合并后用于surl校驗defaultMiddleware默認啟用的安全中間件列表默認值為csrf, hsts, methodnoallow, noopen, nosniff, csp, xssProtection, xframe, dta既可傳逗號分隔的字符串也可傳數(shù)組。在 plugins/security/src/app/middleware/securities.ts 中插件遍歷defaultMiddleware從lib/middlewares/index.ts見 plugins/security/src/lib/middlewares/index.ts按名稱取出對應(yīng)中間件工廠逐個 compose 成一個總中間件。這意味著你可以在defaultMiddleware中整體增刪中間件也可以靠單項的enable開關(guān)控制。值得說明的是當前源碼中hsts的enable默認值為falseconfig.default.ts即Strict-Transport-Security 頭默認不輸出需要 HTTPS 站點按需開啟而 README 中hsts 默認開啟的描述相對舊版本而言已過時本文統(tǒng)一以當前倉庫源碼為準。三、CSRF 與 CTOKEN跨站請求偽造的防范3.1 基本用法ctx.csrfCSRF跨站請求偽造的防范思路是在寫請求中校驗一個只有本站頁面才能拿到的 token。插件通過ctx.csrf暴露 token一般配合 POST 表單使用——頁面渲染時將ctx.csrf作為表單隱藏域或 query string 渲染到頁面上key 為_csrf提交表單時攜帶該 token 即可通過校驗。formData 上傳時使用 csrfform methodPOST action/upload?_csrf{{ ctx.csrf | safe }} enctypemultipart/form-data title: input nametitle / file: input namefile typefile / button typesubmit上傳/button /form從源碼 plugins/security/src/app/extend/context.ts 可以看到ctx.csrf并非直接返回 secret而是基于csrf庫用 secret 生成一個加了隨機鹽的 token——這是為了抵御 BREACH 類攻擊避免 token 與 secret 完全一致被暴力探測。3.2 CTOKENAjax 場景的防跨站對于 Ajax 請求頁面拿不到隱藏域插件提供了 ctokencookie token方案插件會把一個隨機 secret 種到 cookie 中前端發(fā)起 Ajax 時以ctoken為字段名攜帶該值即可。ctoken 的獲取與校驗由以下方法承擔文檔明確約定這些是插件內(nèi)部方法使用者不要調(diào)用ctx.ctoken獲取 ctoken 的邏輯內(nèi)部使用ctx.setCTOKEN()設(shè)置 ctoken 的邏輯內(nèi)部使用ctx.assertCTOKEN()ctoken 校驗邏輯內(nèi)部使用。一個關(guān)鍵的域名設(shè)計是ctx.setCTOKEN()會把 cookie 設(shè)置到主域名下以支持主域名下不同子域名應(yīng)用間的互相調(diào)用。例如在A.xx.com域種下 ctokencookie 會設(shè)置到xx.com域上之后在B.xx.com域可以利用該 ctoken 發(fā)起請求當 A 域通過 jsonp 請求 B 域時B 域同樣可以驗證 ctoken。token 存在哪個 cookie、存什么字段等細節(jié)都可以通過上述接口擴展定制。3.3 csrf 配置項全解完整的csrf配置項及默認值如下與 config.default.ts 中 zod schema 完全對應(yīng)exports.security { csrf: { type: ctoken, // 可以是 ctoken / referer / all / any默認為 ctoken useSession: false, // 如果設(shè)為 truesecret 將存儲在 session 中需啟用 session 插件否則啟動報錯 ignoreJSON: false, // 如果設(shè)為 true將忽略 json 請求已標記為不安全不建議使用 cookieName: csrfToken, // csrf 的 token 在 cookie 中存儲的 key 名稱支持字符串數(shù)組便于平滑遷移 cookie 名 sessionName: csrfToken, // csrf 的 token 在 session 中存儲的 key 名稱 headerName: x-csrf-token, // csrf token 在 header 中的名稱 bodyName: _csrf, // csrf token 在 body 中的名稱支持字符串數(shù)組 queryName: _csrf, // csrf token 在 query 中的名稱支持字符串數(shù)組 rotateWhenInvalid: false, // csrf invalid 時刷新 token用于同域名下多個業(yè)務(wù) token 可能互相影響的情況 refererWhiteList: [], // referer 白名單僅 type 為 referer 時生效 supportedRequests: [ // 支持的 url path pattern 和方法按名單由上至下匹配 url path 正則 // 建議在自定義時配置 {path: /^\//, methods:[POST,PATCH,DELETE,PUT,CONNECT]} 為兜底規(guī)則 { path: /^\//, methods: [POST, PATCH, DELETE, PUT, CONNECT] }, ], // 以下為源碼中可選的進階配置 // cookieDomain: undefined, // 可為字符串或 (ctx) string默認以安全方式自動設(shè)置 // cookieOptions: { signed: false, httpOnly: false, overwrite: true }, }, };其中supportedRequests是最靈活的開關(guān)methods可以為空數(shù)組如果把supportedRequests配置為[{ path: /^\//, methods: [] }]則等效于關(guān)閉 csrf 防御。csrf 中間件的匹配流程見 plugins/security/src/lib/middlewares/csrf.ts先檢查 ignore再確保 secret 存在然后按supportedRequests逐條匹配path與method命中才執(zhí)行ctx.assertCsrf()。3.4 四種校驗類型與底層校驗邏輯type支持ctoken、referer、all、any四種取值校驗邏輯集中在 plugins/security/src/app/extend/context.ts 的assertCsrf()中ctoken校驗請求攜帶的 token從 query → body → header 依次查找與 cookie/session 中的 secret 是否匹配不通過則拋 403referer校驗Referer/Origin頭是否落在refererWhiteList與當前 host 構(gòu)成的域名白名單內(nèi)allctoken 與 referer 兩者都校驗任一失敗即 403any兩者任一通過即放行都失敗才 403。token 的查找順序為 query、body、header對應(yīng)queryName、bodyName、headerName。此外ensureCsrfSecret()負責在首次請求時生成并種下 secret存 cookie 或 sessionrotateCsrfSecret()可在用戶登錄等時機主動輪換 secret當校驗失敗且配置了rotateWhenInvalid: true時也會自動輪換避免同域多業(yè)務(wù) token 相互影響。四、安全重定向safe redirect開放重定向Open Redirect是一種常見的 Web 漏洞攻擊者構(gòu)造跳轉(zhuǎn)到釣魚站點的鏈接誘導(dǎo)用戶。安全插件覆蓋了默認的ctx.redirect方法讓所有跳轉(zhuǎn)都經(jīng)過安全域名判斷ctx.redirect(url)如果目標 url 不在白名單內(nèi)則禁止跳轉(zhuǎn)ctx.unsafeRedirect(url)繞過安全校驗的原始跳轉(zhuǎn)不建議使用。使用ctx.redirect前需要在應(yīng)用配置中聲明安全白名單以.開頭exports.security { domainWhiteList: [.domain.com], // 安全白名單以.開頭 };特別要注意如果沒有配置domainWhiteList或數(shù)組為空則默認對所有跳轉(zhuǎn)請求放行行為等同于ctx.unsafeRedirect(url)同時域名和 url 檢查不區(qū)分大小寫。也就是說白名單為空即放行是為了兼容舊應(yīng)用一旦你配置了白名單安全檢查即生效。重定向的具體實現(xiàn)見 plugins/security/src/app/extend/response.ts以/開頭的相對路徑視為站內(nèi)跳轉(zhuǎn)直接放行但//開頭會被歸一化為//\形式會走后續(xù)檢查防止協(xié)議相對跳轉(zhuǎn)繞過非相對路徑解析 URL僅允許http:/https:協(xié)議若配置了非空domainWhiteList則通過ctx.isSafeDomain()校驗 hostname生產(chǎn)環(huán)境下不通過會記錄告警并重定向到/非生產(chǎn)環(huán)境直接拋 500 便于暴露問題。ctx.isSafeDomain(domain)ctx.isSafeDomain(domain)用于判斷某個域名是否為安全域名安全域名即上面domainWhiteList中配置的域名。源碼實現(xiàn)位于 plugins/security/src/lib/utils.ts比較時統(tǒng)一轉(zhuǎn)小寫、忽略大小寫白名單項若包含*則按通配符匹配如*.domain.com普通項自動補.前綴后做后綴匹配且刻意避免wwweggjs.com誤匹配eggjs.com這類前綴相似域名。五、JSONP 接口防護JSONP 依賴在頁面中動態(tài)插入script執(zhí)行回調(diào)若回調(diào)函數(shù)名可控極易造成 XSS。Egg 的 jsonp 防護在 context 層實現(xiàn)使用jsonp-body模塊防御內(nèi)容包括callback 函數(shù)名長度限制最長 50 個字符limit可配置callback 函數(shù)名字符白名單只允許[、]、字母、數(shù)字、_、$、.防止一般 XSS、UTF-7 XSS 等攻擊默認的 callback 參數(shù)名為_callback可改名。六、安全 Helper 全家桶XSS 過濾與命令注入防護插件在ctx.helper上注冊了一組安全過濾函數(shù)統(tǒng)一聲明在 plugins/security/src/lib/helper/index.ts。它們解決不同場景下的注入問題注意并不是任何時候都要用最重的過濾按輸出位置選擇最合適的 helper 才是最佳實踐。6.1.escape()HTML 實體轉(zhuǎn)義對字符串做 HTML 實體轉(zhuǎn)義是安全性最高、最基礎(chǔ)的 XSS 過濾方式const str scriptalert(abc) /script; console.log(ctx.helper.escape(str)); // gt;lt;scriptgt;alert(quot;abcquot;) lt;/scriptgt;lt;在 nunjucks 等模板引擎中默認會做 escape無需顯式調(diào)用只有在你手工拼接 HTML 字符串時才需要顯式使用。6.2.surl()URL 過濾用于在 HTML 標簽中需要解析 URL 的地方如a href、img src其他地方不允許使用。模板中要輸出的變量應(yīng)包裹helper.surl($value)不使用 surla href$value /output:a hrefhttp://www.domain.comscript /使用 surla hrefhelper.surl($value) /output:a hrefhttp://www.domain.comlt;scriptgt; /特別需要注意在需要解析 url 的地方surl 外面一定要加上雙引號否則不會被當作屬性分隔符處理反而會導(dǎo)致 XSS 漏洞。從源碼 plugins/security/src/lib/helper/surl.ts 看surl 會先校驗協(xié)議相對路徑放行絕對路徑的協(xié)議必須命中白名單默認http、https、file、data加自定義protocolWhiteList非白名單協(xié)議直接返回空字符串隨后把、、、轉(zhuǎn)義為 HTML 實體。6.3.sjs()JavaScript 字符串轉(zhuǎn)義用于在 JS包括onload等事件屬性中輸出變量。它會對變量中的所有非白名單字符做 JAVASCRIPT ENCODE轉(zhuǎn)義為\x形式防止 XSS 攻擊也確保輸出在 JS 中語義正確const foo hello; // 未使用 sjs console.log(var foo ${foo};); // var foo hello; // 使用 sjs console.log(var foo ${this.helper.sjs(foo)};); // var foo \\x22hello\\x22;6.4.shtml()富文本過濾當需要把包含 HTML 的富文本如用戶輸入的帖子內(nèi)容直接輸出到模板中時使用shtml。它允許輸出白名單內(nèi)的 HTML tag同時執(zhí)行 XSS 過濾剔除非法腳本// js const value a hrefhttp://www.domain.comgoogle/ascriptevilcode…/script; // 模板 html body${helper.shtml($value)}/body /html; // a hrefhttp://www.domain.comgoogle/alt;scriptgt;evilcode…lt;/scriptgt;這是一個非常復(fù)雜的安全處理過程對服務(wù)器處理性能有一定影響如果不是輸出 HTML請勿使用。shtml 基于xss模塊在其默認白名單規(guī)則基礎(chǔ)上增加了針對域名的過濾源碼見 plugins/security/src/lib/helper/shtml.ts默認規(guī)則僅放行白名單內(nèi)的 tag 與屬性如a標簽?zāi)J只保留href、title等有限屬性自定義過濾項通過whiteList覆蓋例如只支持a標簽、且除title外其他屬性全部過濾whiteList: { a: [title]; }屬性級自定義可通過onTagAttr(tag, name, value, isWhiteAttr)回調(diào)定制某個 tag 屬性的處理邏輯插件內(nèi)置的域名校驗會作為兜底邏輯保留域名過濾href/src屬性會校驗其 hostname 是否在config.security.domainWhiteList中不在則屬性被清空。config.helper.shtml.domainWhiteList已過時請使用config.security.domainWhiteList代替。注意 shtml 的白名單是嚴格的除了過濾 XSS 風險字符串外不在默認規(guī)則中的 tag 和 attr 都會被過濾掉。例如html/html標簽不在白名單中輸出為空常見的data-xx自定義屬性也會被過濾。因此shtml 的適用場景一般是來自用戶的富文本輸入論壇、評論系統(tǒng)等切忌濫用。如果業(yè)務(wù)本身不支持 HTML 內(nèi)容輸入直接使用escape即可既快又安全。6.5.spath()路徑安全校驗把輸入字符串用作 path 路徑時必須用spath做安全檢驗路徑不合法時返回null。不合法路徑包括使用..的相對路徑目錄穿越使用/開頭的絕對路徑以上試圖通過 url encode 繞過校驗的結(jié)果字符串內(nèi)部會先做decodeURIComponent再判斷見 plugins/security/src/lib/utils.ts 的isSafePath。const foo /usr/local/bin; console.log(this.helper.spath(foo2)); // null6.6.sjson()JSON 輸出轉(zhuǎn)義在 JS 中輸出 JSON 時若未轉(zhuǎn)義易被利用為 XSS 漏洞。sjson會對 JSON 做編碼遍歷 JSON 的 key將 value 中所有非白名單字符轉(zhuǎn)義為\x形式同時保持 JSON 結(jié)構(gòu)不變。若需要在模板中輸出一個 JSON 字符串給 JS 應(yīng)用使用請使用${this.helper.sjson(變量名)}進行轉(zhuǎn)義scriptwindow.locals ${this.helper.sjson(locals)};/script該處理過程較復(fù)雜、性能損耗較大應(yīng)盡量避免使用——能提前序列化并單獨轉(zhuǎn)義的部分盡量在業(yè)務(wù)層處理。6.7.cliFilter()遠程命令執(zhí)行防護遠程命令執(zhí)行RCE漏洞的典型場景是用戶通過瀏覽器提交的參數(shù)被直接拼進系統(tǒng)命令服務(wù)器端未做過濾攻擊者可借此執(zhí)行任意命令、入侵服務(wù)器。如果用戶可控變量是命令中的參數(shù)直接用cliFilter過濾修復(fù)前cp.exec(bash /home/admin/ali-knowledge-graph-backend/initrun.sh port);修復(fù)后cp.exec(bash /home/admin/ali-knowledge-graph-backend/initrun.sh this.helper.cliFilter(port));如果業(yè)務(wù)需要在參數(shù)中添加白名單之外的字符可以將用戶輸入按該字符分割并對每一段分別調(diào)用過濾函數(shù)。如果用戶可控變量是命令本身而非參數(shù)則應(yīng)與開發(fā)協(xié)商修改功能或直接下線該功能——此時任何過濾都無法保證安全。6.8.escapeShellArg()POSIX shell 參數(shù)轉(zhuǎn)義對單個 shell 參數(shù)做 POSIX 轉(zhuǎn)義給字符串增加一對單引號并對已存在的單引號做引用/轉(zhuǎn)碼處理從而安全地把它拼接進 shell 命令字符串const ip 127.0.0.1 cat /etc/passwd; const cmd ping -c 1 this.helper.escapeShellArg(ip); console.log(cmd); //ping -c 1 127.0.0.1 cat /etc/passwd如果可以應(yīng)優(yōu)先使用child_process.execFile()或child_process.spawn()的參數(shù)數(shù)組形式徹底避免字符串拼接。這個 helper 只用于 POSIX shell 命令字符串里的單個參數(shù)不適用于 Windowscmd.exe或 PowerShell 轉(zhuǎn)義。6.9.escapeShellCmd()命令行整體轉(zhuǎn)義從輸入的命令行中直接刪除危險字符#;|*?~^()[]{}$;, 0x0A 和 0xFFconst ip 127.0.0.1 cat /etc/passwd; const cmd ping -c 1 this.helper.escapeShellCmd(ip); console.log(cmd); //ping -c 1 127.0.0.1 cat /etc/passwd可以看到、分號等分隔符被剔除命令被打散成無法注入的形式。相比escapeShellArg它更激進但可能改變參數(shù)含義適用于需要保留整條命令字符串的場景。七、Web 安全響應(yīng)頭由中間件批量注入插件以中間件形式位于 plugins/security/src/lib/middlewares在響應(yīng)階段統(tǒng)一注入安全響應(yīng)頭。下面按 README 順序逐一說明并標注當前源碼中的默認值與配置入口。7.1 HSTSStrict-Transport-SecurityHSTS 強制瀏覽器只通過 HTTPS 訪問本站。按當前源碼默認enable: false需要 HTTPS 站點手動開啟README 中默認開啟的描述對應(yīng)舊版本如果是純 HTTP 站點則務(wù)必保持關(guān)閉。maxAge默認一年即365 * 24 * 3600includeSubdomains默認false設(shè)為true時規(guī)則同樣適用于所有子域名。實現(xiàn)見 plugins/security/src/lib/middlewares/hsts.ts響應(yīng)頭格式為strict-transport-security: max-agemaxAge[; includeSubdomains]。7.2 CSPContent-Security-PolicyCSP 默認關(guān)閉enable: false。需要開啟時必須和安全工程師共同確定策略主要配置項為policy策略對象key 為指令名value 可為字符串、字符串數(shù)組或布爾值。源碼還支持reportOnly僅上報不攔截與supportIEIE 兼容兩個可選開關(guān)。此外插件在 context 上提供了ctx.nonce隨機 16 位字符串可用于 CSP 的 nonce 機制放行內(nèi)聯(lián)腳本見 plugins/security/src/app/extend/context.ts。exports.security { csp: { enable: true, policy: { default-src: self, // img-src: [*, data:], }, }, };7.3 X-Download-Options: noopen默認開啟禁用 IE 下載框中的 Open 按鈕防止 IE 下下載文件默認被打開而觸發(fā) XSS。對應(yīng)中間件 plugins/security/src/lib/middlewares/noopen.ts。7.4 X-Content-Type-Options: nosniff默認開啟禁用 IE8 的 MIME 自動嗅探功能。例如響應(yīng)聲明text/plain卻可能被當成text/html渲染——尤其當本站點服務(wù)內(nèi)容未必可信時nosniff 可以防止這類降級攻擊。對應(yīng)中間件 plugins/security/src/lib/middlewares/nosniff.ts。7.5 X-Frame-Options默認值SAMEORIGIN只允許同源頁面把本頁面當作 iframe 嵌入。value可配置為DENY、SAMEORIGIN或ALLOW-FROM https://example.com。實現(xiàn)見 plugins/security/src/lib/middlewares/xframe.ts。7.6 X-XSS-Protection默認開啟value默認為1; modeblock即 README 中close默認false所對應(yīng)的輸出。開啟后瀏覽器會在檢測到反射型 XSS 時攔截頁面渲染。7.7 補充referrerPolicy 與 dta除 README 列出的響應(yīng)頭外當前源碼還默認啟用了兩個值得了解的中間件referrerPolicy默認enable: false輸出Referrer-Policy頭默認值no-referrer-when-downgrade用于控制瀏覽器在跳轉(zhuǎn)時攜帶多少來源信息保護隱私與防信息泄露dta默認enable: true自動攔截目錄穿越Directory Traversal Attack請求基于isSafePath判斷路徑是否包含..穿越或編碼繞過見 plugins/security/src/lib/middlewares/dta.ts。八、其他防護與擴展能力8.1 請求方法限制插件默認禁止TRACE與TRACK兩種 HTTP 方法對應(yīng) OWASP 的 Cross Site Tracing 攻擊命中時直接返回 405。實現(xiàn)見 plugins/security/src/lib/middlewares/methodnoallow.ts以 Node 內(nèi)置METHODS為基準剔除TRACE/TRACK后構(gòu)建安全方法映射表。8.2 crossdomain.xml 與 robots.txtcrossdomain.xml、robots.txt默認都不由本插件輸出業(yè)務(wù)系統(tǒng)可自行添加如涉及敏感信息需要咨詢項目安全工程師確認策略。8.3 SSRF 防護與 safeCurl源碼擴展當前源碼在配置模型中新增了ssrf配置config.default.ts用于服務(wù)端請求外發(fā)時的 SSRF 防護支持ipBlackListIP 黑名單支持精確 IP 或 CIDR 網(wǎng)段如127.0.0.0/8ipExceptionList從黑名單中豁免的 IPhostnameExceptionList豁免的 hostname 列表checkAddress自定義校驗函數(shù)(address, family, hostname) boolean優(yōu)先級最高。黑名單/豁免邏輯在 plugins/security/src/lib/utils.ts 的preprocessConfig中預(yù)編譯為checkAddress先查 hostname 豁免再查 IP 豁免命中黑名單即拒絕默認放行。與之配套的是 context 與 application 上的safeCurl()方法見 plugins/security/src/app/extend/context.ts 及 plugins/security/src/lib/extend/safe_curl.ts對應(yīng)用外發(fā)請求做安全包裝。九、實踐建議與總結(jié)默認值即安全基線csrf、xframe、nosniff、noopen、xssProtection、dta、methodnoallow默認開啟不建議整體關(guān)閉hsts、csp、referrerPolicy按站點協(xié)議與業(yè)務(wù)需求顯式開啟。按路徑精細控制善用各項子配置的match/ignore字符串、正則、函數(shù)、數(shù)組例如僅對支付/登錄接口嚴格校驗 CSRF對第三方嵌入頁面放行xframe。輸出場景決定過濾方式模板變量默認逃逸拼接 HTML 用escapeURL 屬性用帶雙引號的surlJS 內(nèi)輸出用sjs富文本才考慮shtml注意其白名單嚴格性與性能開銷文件路徑用spath命令參數(shù)用cliFilter/escapeShellArg/escapeShellCmd并優(yōu)先使用execFile/spawn的參數(shù)數(shù)組形式。安全重定向必須配置白名單domainWhiteList為空時ctx.redirect會退化為放行所有外鏈務(wù)必按[.yourdomain.com]的格式顯式聲明。關(guān)注版本差異README 中的部分描述如 hsts 默認開啟與當前源碼默認值存在出入實際行為以 plugins/security/src/config/config.default.ts 的 zod schema 為準。eggjs/security的價值在于開箱即用的安全基線 精細可裁剪的配置面它把 CSRF/CTOKEN、安全重定向、XSS 過濾、安全響應(yīng)頭、方法限制、目錄穿越與 SSRF 防護等常見 Web 威脅統(tǒng)一收斂到一套配置模型與一組 Helper 中。理解每個配置項的默認值與底層實現(xiàn)就能在保證安全的前提下為業(yè)務(wù)定制最合適的防護策略。延伸閱讀插件主文檔plugins/security/README.zh-CN.md默認配置與類型定義plugins/security/src/config/config.default.ts中間件組裝邏輯plugins/security/src/app/middleware/securities.ts安全中間件實現(xiàn)目錄plugins/security/src/lib/middlewares安全 Helper 實現(xiàn)目錄plugins/security/src/lib/helpercontext 擴展csrf/ctoken/非ceplugins/security/src/app/extend/context.ts安全重定向?qū)崿F(xiàn)plugins/security/src/app/extend/response.ts贊分享后端Web框架【免費下載鏈接】egg Born to build better enterprise frameworks and apps with Node.js Koa. https://307.run/eggcode項目地址https://gitcode.com/gh_mirrors/eg/egg點擊查看免費下載相關(guān)推薦Egg 安全插件 eggjs/security 完整指南從 CSRF 防御到 SSRF 防護的源碼級解析Egg 安全插件 eggjs/security 完整指南從 CSRF 防御到 SSRF 防護的源碼級解析 eggjs/security 是 Egg 框架內(nèi)后端Web框架eggjs/jsonp 插件完全指南在 Egg 應(yīng)用中實現(xiàn) JSONP 支持與安全防護eggjs/jsonp 插件完全指南在 Egg 應(yīng)用中實現(xiàn) JSONP 支持與安全防護 導(dǎo)讀 JSONPJSON with Padding是解決瀏覽器跨后端Web框架CANN/asc-devkit SIMT規(guī)約求和APIasc\_reduce\_adda nameZH CN_TOPIC_0000002516816303 /a 產(chǎn)品支持情況a namesectio后端Web框架上一篇深入理解Adagrad優(yōu)化算法原理與實現(xiàn)下一篇Python數(shù)據(jù)科學手冊NumPy入門指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考