客户端应该只看到服务器上的目录及其内容( 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/