javascript - 从客户端到服务器上的真实路径的虚拟路径

标签 javascript node.js security path

客户端应该只看到服务器上的目录及其内容( FS_ROOT )。
服务器应该将从客户端接收到的路径转换为存在的真实路径,并执行客户端请求的文件操作:
我制作了这两个函数来处理这个问题,我想问一下它们是否足够安全。我的意思是客户端应该没有办法欺骗服务器在 FS_ROOT 之外做一些事情

  function fromVirtualPath(virtPath){
    if(virtPath === '/' || virtPath === '.')
      return FS_ROOT;

    virtPath = virtPath.trim();

    if(virtPath[0] === '/')
      virtPath = virtPath.substr(1);

    const absPath = path.resolve(FS_ROOT, virtPath);

    if(absPath.indexOf(FS_ROOT) !== 0)
      throw new Error('Outside root dir - no permissions!');

    return absPath;
  }

  function toVirtualPath(absPath){
    return '/' + path.relative(FS_ROOT, absPath);
  }
示例真实路径:/www/site.com/public_html/yo客户应该看到:/yo

最佳答案

关于 fromVirtualPath我会简单地移动这条线 virtPath = virtPath.trim();成为函数的第一行,然后就可以了。
如果值传递给 toVirtualPath总是返回值 fromVirtualPath ,是的,它足够安全;否则我们可以检查该值是否是一个好的 absPath。

function fromVirtualPath(virtPath) {
  virtPath = virtPath.trim();

  if (virtPath === '/' || virtPath === '.')
    return FS_ROOT;

  if (virtPath[0] === '/')
    virtPath = virtPath.substr(1);

  const absPath = path.resolve(FS_ROOT, virtPath);

  if (absPath.indexOf(FS_ROOT) !== 0)
    throw new Error('Outside root dir - no permissions!');

  return absPath;
}

function toVirtualPath(absPath) {
  if (absPath.indexOf(FS_ROOT) !== 0)
    throw new Error('Bad absolute path!');

  return '/' + path.relative(FS_ROOT, absPath);
}

关于javascript - 从客户端到服务器上的真实路径的虚拟路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63440210/

相关文章:

javascript - 错误 : ENOENT: no such file or directory, 统计 Laravel 混合错误

node.js - PM2 不会在 Docker 内部启动

json - MongoDB 集合格式

security - 如何使用 USB key 来保护我的应用程序?

c# - 如何创建 C# 登录处理程序

javascript - Div 预览如缩略图

javascript - 无法从 GMap v3 隐藏标记

java - JVM 如何保护文件访问?

javascript - 找不到指定 id 未定义的上下文

node.js - 无法使用VS代码从 Node js中的控制台读取