Node.js 響應(yīng)輸出

2021-06-01 10:01 更新

1.6.1 【必須】設(shè)置正確的HTTP響應(yīng)包類型

  • 響應(yīng)頭 Content-Type 與實(shí)際響應(yīng)內(nèi)容,應(yīng)保持一致。如:API 響應(yīng)數(shù)據(jù)類型是 json,則響應(yīng)頭使用application/json;若為 xml,則設(shè)置為text/xml。

1.6.2 【必須】添加安全響應(yīng)頭

  • 所有接口、頁面,添加響應(yīng)頭 X-Content-Type-Options: nosniff
  • 所有接口、頁面,添加響應(yīng)頭X-Frame-Options。按需合理設(shè)置其允許范圍,包括:DENY、SAMEORIGINALLOW-FROM origin。用法參考:MDN文檔
  • 推薦使用組件: helmet

1.6.3 【必須】外部輸入拼接到響應(yīng)頁面前,進(jìn)行編碼處理

場(chǎng)景 編碼規(guī)則
輸出點(diǎn)在 HTML 標(biāo)簽之間 需要對(duì)以下 6 個(gè)特殊字符進(jìn)行 HTML 實(shí)體編碼(&<>"',/)。
示例:
& --> `&amp;
< --> &lt;
>--> &gt;
" --> &quot;
' --> &#x27;  
/ --> &#x2F;
輸出點(diǎn)在 HTML 標(biāo)簽普通屬性內(nèi)(如 href、src、style 等,on 事件除外) 要對(duì)數(shù)據(jù)進(jìn)行 HTML 屬性編碼。
編碼規(guī)則:除了阿拉伯?dāng)?shù)字和字母,對(duì)其他所有的字符進(jìn)行編碼,只要該字符的 ASCII 碼小于 256。編碼后輸出的格式為&#xHH;(以&#x開頭,HH則是指該字符對(duì)應(yīng)的十六進(jìn)制數(shù)字,分號(hào)作為結(jié)束符)
輸出點(diǎn)在 JS 內(nèi)的數(shù)據(jù)中 需要進(jìn)行 js 編碼
編碼規(guī)則:
除了阿拉伯?dāng)?shù)字和字母,對(duì)其他所有的字符進(jìn)行編碼,只要該字符的 ASCII 碼小于 256。編碼后輸出的格式為 \xHH (以 \x 開頭,HH 則是指該字符對(duì)應(yīng)的十六進(jìn)制數(shù)字)
Tips:這種場(chǎng)景僅限于外部數(shù)據(jù)拼接在 js 里被引號(hào)括起來的變量值中。除此之外禁止直接將代碼拼接在 js 代碼中。
輸出點(diǎn)在 CSS 中(Style 屬性) 需要進(jìn)行 CSS 編碼
編碼規(guī)則:
除了阿拉伯?dāng)?shù)字和字母,對(duì)其他所有的字符進(jìn)行編碼,只要該字符的 ASCII 碼小于 256。編碼后輸出的格式為 \HH (以 \ 開頭,HH則是指該字符對(duì)應(yīng)的十六進(jìn)制數(shù)字)
輸出點(diǎn)在 URL 屬性中 對(duì)這些數(shù)據(jù)進(jìn)行 URL 編碼
Tips:除此之外,所有鏈接類屬性應(yīng)該校驗(yàn)其協(xié)議。禁止 JavaScript、data 和 Vb 偽協(xié)議。

1.6.4 【必須】響應(yīng)禁止展示物理資源、程序內(nèi)部代碼邏輯等敏感信息

  • 業(yè)務(wù)生產(chǎn)(正式)環(huán)境,應(yīng)用異常時(shí),響應(yīng)內(nèi)容禁止展示敏感信息。包括但不限于:物理路徑、程序內(nèi)部源代碼、調(diào)試日志、內(nèi)部賬號(hào)名內(nèi)網(wǎng)ip地址等。

// bad
Access denied for user 'xxx'@'xx.xxx.xxx.162' (using password: NO)"

1.6.5 【推薦】添加安全縱深防御措施

  • 部署 CSP,規(guī)則中應(yīng)引入最新的嚴(yán)格模式特性nonce-

// good:使用helmet組件安全地配置響應(yīng)頭
const express = require("express");
const helmet = require("helmet");
const app = express();
app.use(helmet());


// good:正確配置Content-Type、添加了安全響應(yīng)頭,引入了CSP
Router.get("/", (req, res) => {
    res.header("Content-Type", "application/json");
    res.header("X-Content-Type-Options", "nosniff");
    res.header("X-Frame-Options", "SAMEORIGIN");
    res.header("Content-Security-Policy", "script-src 'self'");
});

關(guān)聯(lián)漏洞:中風(fēng)險(xiǎn) - XSS、中風(fēng)險(xiǎn) - 跳轉(zhuǎn)漏洞

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)