Node.js 文件操作

2021-06-01 09:51 更新

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

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

1.3.2 【必須】校驗并限定文件路徑范圍

  • 應(yīng)固定上傳、訪問文件的路徑。若需要拼接外部可控變量值,檢查是否包含...路徑穿越字符。如存在,應(yīng)拒絕。
  • 使用fs模塊下的函數(shù)方法時,應(yīng)對第一個參數(shù)即路徑部分做校驗,檢查是否包含路徑穿越字符...。涉及方法包括但不限于:fs.truncate、fs.truncateSyncfs.chown、fs.chownSync、fs.lchown、fs.lchownSync、fs.stat、fs.lchmodSyncfs.lstatfs.statSyncfs.lstatSyncfs.readlink、fs.unlink、fs.unlinkSync、fs.rmdirfs.rmdirSyncfs.mkdirfs.mkdirSyncfs.readdirfs.readdirSync、fs.openSync、fs.open、fs.createReadStreamfs.createWriteStream
  • 使用express框架的sendFile方法時,應(yīng)對第一個參數(shù)即路徑部分做校驗,檢查是否包含路徑穿越字符...
  • 校驗時,應(yīng)使用path模塊處理前的路徑參數(shù)值,或判斷處理過后的路徑是否穿越出了當(dāng)前工作目錄。涉及方法包括但不限于:path.resolve、path.join、path.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處理過后的路徑參數(shù)值做校驗,仍可能有路徑穿越風(fēng)險
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位以上的隨機字符串保存。
  • 如需原樣保留文件名,應(yīng)檢查是否包含...路徑穿越字符。如存在,應(yīng)拒絕。

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號