Node.js 文件操作

2021-06-01 09:51 更新

1.3.1 【必须】限定文件操作的后缀范围

  • 按业务需求,使用白名单限定后缀范围。

1.3.2 【必须】校验并限定文件路径范围

  • 应固定上传、访问文件的路径。若需要拼接外部可控变量值,检查是否包含...路径穿越字符。如存在,应拒绝。
  • 使用fs模块下的函数方法时,应对第一个参数即路径部分做校验,检查是否包含路径穿越字符...。涉及方法包括但不限于:fs.truncatefs.truncateSyncfs.chownfs.chownSyncfs.lchownfs.lchownSyncfs.statfs.lchmodSyncfs.lstatfs.statSyncfs.lstatSyncfs.readlinkfs.unlinkfs.unlinkSyncfs.rmdirfs.rmdirSyncfs.mkdirfs.mkdirSyncfs.readdirfs.readdirSyncfs.openSyncfs.openfs.createReadStreamfs.createWriteStream
  • 使用express框架的sendFile方法时,应对第一个参数即路径部分做校验,检查是否包含路径穿越字符...
  • 校验时,应使用path模块处理前的路径参数值,或判断处理过后的路径是否穿越出了当前工作目录。涉及方法包括但不限于:path.resolvepath.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处理过后的路径参数值做校验,仍可能有路径穿越风险
  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位以上的随机字符串保存。
  • 如需原样保留文件名,应检查是否包含...路径穿越字符。如存在,应拒绝。

1.3.4 【必须】敏感资源文件,应有加密、鉴权和水印等加固措施

  • 用户上传的身份证银行卡等图片,属敏感资源文件,应采取安全加固。
  • 指向此类文件的URL,应保证不可预测性;同时,确保无接口会批量展示此类资源的URL。
  • 访问敏感资源文件时,应进行权限控制。默认情况下,仅用户可查看、操作自身敏感资源文件。
  • 图片类文件应添加业务水印,表明该图片仅可用于当前业务使用。
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号