cnode上传文件源码。有些地方求指导
发布于 10 年前 作者 icarusysuper 3691 次浏览 最后一次编辑是 8 年前

直接上代码

var uid = req.session.user._id.toString();
  var userDir = path.join(config.upload_dir, uid);
  ndir.mkdir(userDir, function (err) {
    if (err) {
      return next(err);
    }
    var filename = Date.now() + '_' + file.name;
    var savepath = path.resolve(path.join(userDir, filename));
    // 求问这里为什么要做这样的一个验证。根据上下文, savepath是由path.resolve(path.join(userDir, filename))拼成的。
    // 所以这个条件判断中的语句不是肯定===0吗?
    if (savepath.indexOf(path.resolve(userDir)) !== 0) {                     
      return res.send({status: 'forbidden'});
    }
    fs.rename(file.path, savepath, function (err) {
      if (err) {
        return next(err);
      }
      var url = '/upload/' + uid + '/' + encodeURIComponent(filename);
      res.send({ status: 'success', url: url });
    });
  });
};

谢谢。

1 回复

额- -我大概明白了。自己回答下吧。这样做其中的一个原因是filename可能是类似../../test.txt的字符串。所以还是要验证一下,避免文件移动到上层目录,造成攻击。

回到顶部