恶意上传与路径穿越
前端可做 类型与大小校验,但若攻击者直连 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 禁止用户可控主机部分。
小结
前端:限制选择与提示;服务端:内容检测 + 随机名 + 路径规范化 + 权限最小化。
