accept属性仅提示浏览器筛选文件类型,不能阻止上传;真正限制需前端校验file.name扩展名+读取文件头魔数,后端必须用file-type等库校验二进制流前若干字节并重命名保存。

accept 属性只能提示浏览器筛选文件类型,不能阻止用户上传任意文件。真正限制必须靠前端 JS 校验 + 后端魔数识别双保险。
accept 属性怎么写才有效
无效写法会直接被浏览器忽略(比如 iOS Safari 完全不响应),关键在于格式和取值:
-
accept="image/jpeg,image/png,.jpg,.png"—— MIME 类型与带点扩展名混用,逗号后不能有空格,兼容性最好 -
accept="image/*"—— 所有图片类型,iOS 和旧版 Android 支持稳定,但不够精确 -
accept=".pdf,.docx"—— 仅用扩展名更可靠,尤其对 Office 文档;accept="application/pdf"在部分安卓浏览器可能失效 - 别写
accept="jpg,png"或accept="image/jpg"—— 前者非法,后者 MIME 不标准,Safari 和 Chrome 都可能丢弃整个属性
为什么 file.type 不可信,该用什么判断
file.type 是浏览器根据文件扩展名或系统注册表推测的,常为空、可伪造(比如把 malware.exe 改名成 cat.jpg)。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 优先用
file.name.toLowerCase().endsWith('.pdf')检查扩展名,注意统一转小写 - 关键业务必须读文件头:PNG 是
\x89PNG,PDF 是%PDF,可用FileReader读前 4 字节比对 - 多文件上传时,必须遍历
event.target.files每一项,不能只校验第一个
后端校验为什么不可跳过
所有前端检查都可在 DevTools 里瞬间绕过。服务端收到文件后必须:
- 完全忽略请求头里的
Content-Type和前端传来的扩展名 - 用库(如 Node.js 的
file-type、Python 的python-magic)读二进制流前若干字节,确认真实 MIME - 保存时重命名文件,例如生成 UUID +
.jpg,而非保留原始名 - 上传目录禁用执行权限,静态资源走 CDN 或独立域名,避免 HTML/JS 文件被直接解析执行
最容易被忽略的是:即使 accept 写对了、前端 JS 也校验了,只要后端没做魔数识别,攻击者就能上传伪装成图片的 WebShell 并通过 URL 直接访问执行。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










