Skip to content

恶意上传与路径穿越

前端可做 类型与大小校验,但若攻击者直连 API,必须通过服务端 校验扩展名、MIME、魔数、随机文件名与存储路径。路径穿越../../../etc/passwd)常见于解压 ZIP、拼接存储路径。


前端校验示例(不可单独依赖)

js
const input = document.querySelector('input[type=file]');
input.addEventListener('change', () => {
  const f = input.files?.[0];
  if (!f) return;
  const okExt = /\.(png|jpg|jpeg)$/i.test(f.name);
  const okSize = f.size <= 2 * 1024 * 1024;
  if (!okExt || !okSize) {
    alert('仅允许 png/jpg 且 ≤2MB');
    input.value = '';
  }
});

攻击者可用 curl 绕过浏览器侧校验。


路径穿越示意(解压场景)

恶意 ZIP 内含条目 ../../../../var/www/html/shell.php。若服务端解压未规范化路径,可能写到 Web 根目录。

服务端要点: path.resolve 后校验 必须以目标目录为前缀;拒绝 ..


存储隔离

用户上传文件应落在 对象存储 / 独立静态域名,与业务服务器分离;返回 URL 禁止用户可控主机部分


小结

前端:限制选择与提示;服务端:内容检测 + 随机名 + 路径规范化 + 权限最小化