Node.js 文件操作

2021-06-01 09:51 更新

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

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

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

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

  1. const fs = require("fs");
  2. const path = require("path");
  3. let filename = req.query.ufile;
  4. let root = '/data/ufile';
  5. // bad:未檢查文件名/路徑
  6. fs.readFile(root + filename, (err, data) => {
  7. if (err) {
  8. return console.error(err);
  9. }
  10. console.log(`異步讀取: ${data.toString()}`);
  11. });
  12. // bad:使用path處理過后的路徑參數(shù)值做校驗(yàn),仍可能有路徑穿越風(fēng)險(xiǎn)
  13. filename = path.join(root, filename);
  14. if (filename.indexOf("..") < 0) {
  15. fs.readFile(filename, (err, data) => {
  16. if (err) {
  17. return console.error(err);
  18. }
  19. console.log(data.toString());
  20. });
  21. };
  22. // good:檢查了文件名/路徑,是否包含路徑穿越字符
  23. if (filename.indexOf("..") < 0) {
  24. filename = path.join(root, filename);
  25. fs.readFile(filename, (err, data) => {
  26. if (err) {
  27. return console.error(err);
  28. }
  29. console.log(data.toString());
  30. });
  31. };

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

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

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號