Node.js 文件操作

2021-06-01 09:51 更新

1.3.1 【必須】限定文件操作的后綴范圍

  • 按業(yè)務(wù)需求,使用白名單限定后綴范圍。

1.3.2 【必須】校驗(yàn)并限定文件路徑范圍

  • 應(yīng)固定上傳、訪問(wèn)文件的路徑。若需要拼接外部可控變量值,檢查是否包含..、.路徑穿越字符。如存在,應(yīng)拒絕。
  • 使用fs模塊下的函數(shù)方法時(shí),應(yīng)對(duì)第一個(gè)參數(shù)即路徑部分做校驗(yàn),檢查是否包含路徑穿越字符...。涉及方法包括但不限于:fs.truncate、fs.truncateSync、fs.chownfs.chownSync、fs.lchown、fs.lchownSyncfs.stat、fs.lchmodSync、fs.lstatfs.statSync、fs.lstatSync、fs.readlink、fs.unlinkfs.unlinkSync、fs.rmdir、fs.rmdirSync、fs.mkdirfs.mkdirSync、fs.readdir、fs.readdirSync、fs.openSyncfs.open、fs.createReadStream、fs.createWriteStream
  • 使用express框架的sendFile方法時(shí),應(yīng)對(duì)第一個(gè)參數(shù)即路徑部分做校驗(yàn),檢查是否包含路徑穿越字符...
  • 校驗(yàn)時(shí),應(yīng)使用path模塊處理前的路徑參數(shù)值,或判斷處理過(guò)后的路徑是否穿越出了當(dāng)前工作目錄。涉及方法包括但不限于:path.resolve、path.joinpath.normalize

const fs = require("fs");
const path = require("path");
let filename = req.query.ufile;
let root = '/data/ufile';


// bad:未檢查文件名/路徑
fs.readFile(root + filename, (err, data) => {
    if (err) {
        return console.error(err);
    }
    console.log(`異步讀取: ${data.toString()}`);
});


// bad:使用path處理過(guò)后的路徑參數(shù)值做校驗(yàn),仍可能有路徑穿越風(fēng)險(xiǎn)
filename = path.join(root, filename);
if (filename.indexOf("..") < 0) {
    fs.readFile(filename, (err, data) => {
        if (err) {
            return console.error(err);
        }
        console.log(data.toString());
    });
};


// good:檢查了文件名/路徑,是否包含路徑穿越字符
if (filename.indexOf("..") < 0) {
    filename = path.join(root, filename);
    fs.readFile(filename, (err, data) => {
        if (err) {
            return console.error(err);
        }
        console.log(data.toString());
    });
};

1.3.3 【必須】安全地處理上傳文件名

  • 將上傳文件重命名為16位以上的隨機(jī)字符串保存。
  • 如需原樣保留文件名,應(yīng)檢查是否包含...路徑穿越字符。如存在,應(yīng)拒絕。

1.3.4 【必須】敏感資源文件,應(yīng)有加密、鑒權(quán)和水印等加固措施

  • 用戶上傳的身份證、銀行卡等圖片,屬敏感資源文件,應(yīng)采取安全加固。
  • 指向此類文件的URL,應(yīng)保證不可預(yù)測(cè)性;同時(shí),確保無(wú)接口會(huì)批量展示此類資源的URL。
  • 訪問(wèn)敏感資源文件時(shí),應(yīng)進(jìn)行權(quán)限控制。默認(rèn)情況下,僅用戶可查看、操作自身敏感資源文件。
  • 圖片類文件應(yīng)添加業(yè)務(wù)水印,表明該圖片僅可用于當(dāng)前業(yè)務(wù)使用。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)