H5文件上传需分层防护:前端三重轻量校验(MIME、大小、扩展名)+ HTML静态扫描(正则初筛+DOM深检)+ 敏感词预提示;后端承担最终安全决策,所有前端检查仅作体验优化。

H5 文件上传时的安全扫描与敏感词前置过滤,不能靠单一手段解决,必须分层协作:前端做快速响应和体验优化,后端做最终裁决和合规兜底。所有客户端检查都可被绕过,因此只用于提示和减负,不用于放行决策。
前端文件校验:三重轻量拦截
用户选中文件后,立即在主线程执行以下检查:
-
MIME 类型白名单:读取
file.type,仅允许text/html、application/xhtml+xml等可信类型;不信任浏览器自动识别结果,需配合扩展名二次确认 -
文件大小限制:用
file.size控制上限(如 ≤ 2MB),避免大文件阻塞主线程或触发内存警告 -
扩展名强校验:从
file.name提取后缀(name.split('.').pop().toLowerCase()),比对预设列表(如['html', 'htm']),防止通过修改 type 伪装
任一不满足,清空 <input type="file"> 的 value,并给出明确提示:“仅支持小于 2MB 的 .html 文件”。
HTML 内容静态扫描:结构化检测而非简单正则
用 FileReader.readAsText() 读取为字符串后,不做直接渲染,而是分两步分析:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
-
文本层初筛:用正则匹配高危模式,如
/<script>]*>/i</script>、/onload\s*=/i、/javascript:/i,发现即中断流程并定位行号提示 -
DOM 层深检:创建临时
<div>,赋值 <code>innerHTML,遍历子节点检查是否存在<iframe></iframe>、<object></object>、<embed></embed>标签,或内联事件属性(onclick、onerror等);该方式能识别混淆写法(如onload=alert(1))两项任一命中,阻止上传并高亮问题位置,方便用户自查修正。
敏感词与风险特征的合理分工
敏感词过滤不是前端该独立承担的任务,但可辅助提示:
-
主线程做轻量预筛:提取 HTML 中所有文本节点内容(去除标签)、
title、alt、placeholder等可读字段,用正则粗略匹配高频违规词(如“政zhi”、“色#情”),仅用于 UI 提示(如禁用提交按钮 + 黄色警告) -
Worker 不参与决策:若需处理大文件,可用 Worker 对清洗后的纯文本块做分块统计(如 script 标签数量、
href域名分布、base64 密度),但不返回“是否违规”,只输出特征摘要供主线程参考 - 真正判断必须后端落地:原始 HTML 字符串、文件哈希、用户身份等元数据,通过 HTTPS 发往后端;服务端再执行 DOM 解析、CSP 白名单净化、NLP 模型打标、实时词库匹配等不可绕过的合规检查
动态行为沙箱预览(可选增强)
如需在上传前模拟 HTML 行为,必须隔离执行环境:
- 将读取的 HTML 字符串转为
Blob,生成URL.createObjectURL(blob) - 加载到
<iframe sandbox="allow-scripts allow-same-origin"></iframe>中,禁用弹窗、表单提交、插件、顶级导航等能力 - 配合 CSP 头(如
script-src 'none')进一步限制脚本来源,确保即使有残留 JS 也无法执行危险操作
该预览仅用于展示效果,不作为安全依据;任何“看起来正常”的预览都不能替代后端校验。
-
主线程做轻量预筛:提取 HTML 中所有文本节点内容(去除标签)、

















