FairEmail 安全消息视图:剥离脚本与清理 HTML 的完整逻辑
安全消息视图是什么
安全消息视图(Safe message view)是 FairEmail 在显示邮件正文前执行的一套内容净化处理。它的核心思路很简单:一封邮件只需要能读就行,不需要运行脚本、加载外部资源、执行插件。所以 FairEmail 在渲染前把邮件 HTML 里所有「不是用来显示文字」的东西全部剥离掉。
这个处理在 FairEmail 打开任何一封邮件时都会自动执行,无法关闭(这是有意为之的设计)。
具体剥离内容
JavaScript 脚本
剥离所有 <script>...</script> 标签及其内容。这是最关键的一步——如果邮件 HTML 中嵌入了恶意 JavaScript,在 FairEmail 中完全不会执行。即使攻击者构造了利用 Android WebView 漏洞的 payload,也无法生效。
外链样式表
剥离所有 <link rel="stylesheet" href="..."> 标签。原因有两个:
- 外部 CSS 文件可能被用来追踪(加载 = 发起网络请求)
- 外部 CSS 可能通过特殊语法(如
content:属性)来探测 WebView 版本
FairEmail 会保留 <style>...</style> 内联样式标签(因为内联样式不发起外部请求),但会对其中的危险属性做白名单过滤。
危险 HTML 标签
以下标签在净化后会被完全移除:
| 标签 | 为什么危险 |
|---|---|
<iframe> | 可嵌入任意外部网页,等同于在邮件里打开一个浏览器窗口 |
<object> / <embed> | 可嵌入浏览器插件(Flash、Java Applet 等),这些插件历史上有大量安全漏洞 |
<applet> | 已废弃的 Java 小程序标签,同理 |
<form> | 可以构造钓鱼表单让你输入敏感信息 |
<meta http-equiv="refresh"> | 可实现邮件自动跳转到恶意网页 |
HTML 事件处理器
剥离所有 HTML 标签上的事件处理器属性:
onclick、onmouseover、onmouseout、onfocus、onbluronload、onerror、onunload等
这些属性会在用户交互时触发 JavaScript,剥离后彻底消除这类执行路径。
危险 URL 协议
HTML 链接和图片引用中,以下 URL 协议会被过滤:
javascript:—— 直接在点击时执行 JavaScriptvbscript:—— 同理,主要威胁旧版 IEfile://—— 可能尝试读取你设备上的本地文件
保留的协议:http://、https://、mailto:、tel:(但 tel: 链接的自动拨号行为也需要用户确认)
CSS 危险属性
内联 <style> 中某些可能导致风险的 CSS 属性会被过滤:
expression()—— 旧式 IE 中可执行 JS 的语法url()中指向外部非图片资源的引用position: fixed—— 可能被用来遮挡界面或模拟原生 UI
保留的内容
安全消息视图不会把邮件变成纯文本——它会保留完整的排版和格式:
- 段落、标题、列表、引用块的层次结构
- 加粗、斜体、下划线、删除线
- 内嵌图片(作为附件的图片,不发起外部请求)
- 安全的 HTML 链接(
http://和https://,但点击需要确认) - 表格(HTML 表格标签本身没有执行风险,所以保留)
最终呈现的是一份内容和排版完整、但所有动态行为和外部依赖都被剥离的静态文档。
为什么不直接用 Android 原生 WebView 显示
Android WebView 默认开启 JavaScript 执行。Google 在 WebView 中发现了很多历史漏洞(比如通过构造特殊 HTML 代码绕过沙箱执行任意代码)。FairEmail 选择「先净化再显示」的策略,而不是依赖 WebView 自身的安全配置(后者历史上多次失效)。
与反钓鱼防护的配合
安全消息视图是 FairEmail 三层反钓鱼防护中的第一层(让恶意代码无法执行):
- 安全消息视图 → 剥离代码执行路径
- 图片加载控制 → 不主动加载追踪图片(见反追踪图片页)
- 链接确认弹窗 → 点击链接前展示实际 URL(见反钓鱼机制页)
三层配合才能形成完整防护——任何一层都不是单独万能的。
已知限制
邮件重格式化后某些格式可能丢失
复杂的 HTML 邮件(比如某些营销邮件用 CSS Grid 布局)在净化后可能会丢失部分样式。FairEmail 优先保证安全,排版完整性退居其次。
原始消息查看
如果你想看未经任何处理的邮件原始 HTML(比如排查邮件格式问题):邮件详情页右上角菜单 → 「显示原始消息」。原始消息会以纯文本形式显示,不会被 WebView 渲染,所以依然安全。