W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
1.3.1 【必須】限定文件操作的后綴范圍
1.3.2 【必須】校驗(yàn)并限定文件路徑范圍
..
、.
路徑穿越字符。如存在,應(yīng)拒絕。fs
模塊下的函數(shù)方法時(shí),應(yīng)對(duì)第一個(gè)參數(shù)即路徑部分做校驗(yàn),檢查是否包含路徑穿越字符.
或..
。涉及方法包括但不限于:fs.truncate
、fs.truncateSync
、fs.chown
、fs.chownSync
、fs.lchown
、fs.lchownSync
、fs.stat
、fs.lchmodSync
、fs.lstat
、fs.statSync
、fs.lstatSync
、fs.readlink
、fs.unlink
、fs.unlinkSync
、fs.rmdir
、fs.rmdirSync
、fs.mkdir
、fs.mkdirSync
、fs.readdir
、fs.readdirSync
、fs.openSync
、fs.open
、fs.createReadStream
、fs.createWriteStream
sendFile
方法時(shí),應(yīng)對(duì)第一個(gè)參數(shù)即路徑部分做校驗(yàn),檢查是否包含路徑穿越字符.
或..
path
模塊處理前的路徑參數(shù)值,或判斷處理過(guò)后的路徑是否穿越出了當(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處理過(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 【必須】安全地處理上傳文件名
..
、.
路徑穿越字符。如存在,應(yīng)拒絕。1.3.4 【必須】敏感資源文件,應(yīng)有加密、鑒權(quán)和水印等加固措施
身份證
、銀行卡
等圖片,屬敏感資源文件,應(yīng)采取安全加固。Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: