以下是与使用 TinyMCE 的网站或应用程序相关的一般安全建议。

概述

  • 报告 TinyMCE 安全问题

  • 我们为维护 TinyMCE 安全所采取的措施

    • 脚本和 XSS 漏洞

    • 保持依赖项更新

  • 安全保障与合规

  • 使用 HSTS 强制实施 HTTPS

  • 为 TinyMCE 配置内容安全策略 (CSP)

  • 用户输入元素的一般安全风险

    • 跨站脚本攻击 (XSS)

    • 注入攻击

    • 清理 HTML 输入以防范 XSS 攻击

    • 保护嵌入式外部资源

    • 数据传输和存储不安全

    • 身份验证和会话管理失效

    • 使用含有已知漏洞的组件

    • 更多安全信息

报告 TinyMCE 安全问题

Tiny 重视安全研究人员为提高全球技术产品安全性所做的工作。我们欢迎希望负责任地披露我们产品或系统中漏洞的研究人员。

请注意,我们不提供任何“漏洞奖励”计划,也不为披露的漏洞提供任何形式的报酬。

如需报告潜在的安全漏洞,请通过infosec@tiny.cloud联系我们的安全团队。

根据美国国家基础设施咨询委员会 (NIAC) 漏洞披露框架(PDF 链接),Tiny 要求报告潜在安全漏洞的社区成员在 Tiny 调查问题并采取措施修复之前,对其报告和发现保密。

Tiny 会就您报告的状态与您沟通,并在征得您的许可后,在问题修复和披露后,公开将该安全问题的发现归功于您。

我们为维护 TinyMCE 安全所采取的措施

为保护 TinyMCE 用户,Tiny 采取以下措施:

  • 修补跨站脚本攻击 (XSS) 漏洞,

  • 保持 TinyMCE 依赖项更新,以及

  • 提供有关使用 HSTS 强制实施 HTTPS 的建议,以及

  • 提供有关如何配置适用于 TinyMCE 的内容安全策略的信息。

脚本和 XSS 漏洞

TinyMCE 会过滤编辑器内容中的脚本等内容,但客户端应用程序可能会被攻击者绕过。Tiny 建议通过服务器端过滤器处理接收到的编辑器内容。

为保护用户及其终端用户,TinyMCE 不支持 SVG(可缩放矢量图形)。SVG 可用于执行客户端和服务器端攻击。

自 2020 年 1 月 1 日起,已修复的 XSS 漏洞的安全公告将发布在TinyMCE GitHub 仓库的安全页面上。

保持依赖项更新

为保护用户,Tiny 确保在下一个版本(主要或次要版本)发布之前更新 TinyMCE 依赖项。

安全保障与合规

Tiny 在Tiny 信任中心发布其安全和合规状况,包括其维护的框架。

信任中心还提供支持性文档,如审计报告、渗透测试报告和已完成的安全状况问卷。这些文档可通过信任中心按需提供。

使用 HSTS 强制实施 HTTPS

Tiny 安全团队强烈建议嵌入 TinyMCE 的客户将 Web 服务器配置为包含 HTTP 严格传输安全 (HSTS) 头,以用于通过 HTTPS 提供服务的网站。这可以通过更新服务器配置以启用 HSTS 来实现。

HSTS 确保仅使用加密通信,减轻降级攻击,并增强对用户数据的保护。虽然 HSTS 集成对于 TinyMCE 是可选的,但采用此最佳实践可显著降低使用 TinyMCE 的项目中出现漏洞的风险。

如果没有 HSTS,访问网站的用户可能会遭受中间人 (MITM) 攻击。攻击者可以通过拦截未加密的 HTTP 流量、将用户重定向到恶意网站或执行降级攻击以强制通过 HTTP 而非 HTTPS 连接来利用此漏洞。这种加密的缺失会危及敏感用户数据,包括凭据、会话 cookie 和个人信息。通过启用 HSTS,这些风险得到有效缓解,因为浏览器会强制该网站所有未来的交互都使用安全的 HTTPS 连接。

有关实施 HSTS 的全面指南,请参考以下资源:

为 TinyMCE 配置内容安全策略 (CSP)

TinyMCE 可以与 CSP 头一起使用。使用 CSP 时,以下指令对于 TinyMCE 正常运行是必需的:

策略指令原因

script-src 'self' *.tinymce.com *.tiny.cloud;

脚本有时会作为带有 src 属性的脚本元素加载。

connect-src 'self' *.tinymce.com *.tiny.cloud blob:;

拼写检查和PowerPaste等服务需要XMLHttpRequest。

img-src 'self' *.tinymce.com *.tiny.cloud data: blob:;

编辑器中的图像有时是base64编码的、blob URL,或通过Tiny Cloud服务代理。

style-src 'self' 'unsafe-inline' *.tinymce.com *.tiny.cloud;

样式用于内联格式化(如下划线、字体颜色等)和用户界面元素定位。

font-src 'self' *.tinymce.com *.tiny.cloud;

字体用于UI中的图标,从外部文件加载。

有一种强化的CSP方法,通常称为严格CSP。严格CSP:

  1. 为所有<script>元素使用nonce;

  2. 在每次页面加载时重新生成每个nonce;

  3. 重构内联事件处理程序,使其从JavaScript块添加;并且

  4. 在任何指令中都不允许unsafe-inline值。

但是,TinyMCE目前在style-src指令中需要unsafe-inline值,以呈现纯文本以外的内容。

因此,目前不支持在严格CSP配置中运行TinyMCE。

此外,上述所需指令阻止从外部源加载任何内容。要允许来自特定源的内容,请将源域添加到相关指令中。例如,要允许YouTube视频:

media-src 'self' *.youtube.com;

要允许来自任何源的内容,使用(*)通配符。允许所有源(使用*)会否定该源类型的安全策略。例如:

media-src *;

有关内容安全策略的信息,请参阅:MDN Web Docs - 内容安全策略(CSP)。

使用Tiny Cloud时,请使用此CSP标头:

<meta
  http-equiv="Content-Security-Policy"
  content="default-src 'none'; script-src 'self' *.tinymce.com *.tiny.cloud; connect-src 'self' *.tinymce.com *.tiny.cloud blob:; img-src 'self' *.tinymce.com *.tiny.cloud data: blob:; style-src 'self' 'unsafe-inline' *.tinymce.com *.tiny.cloud; font-src 'self' *.tinymce.com *.tiny.cloud;"
>

当从本地域自托管TinyMCE时,请使用此CSP标头(不包括*.tiny.cloud域):

<meta
  http-equiv="Content-Security-Policy"
  content="default-src 'none'; script-src 'self'; connect-src 'self' blob:; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; font-src 'self';"
>

用户输入元素的一般安全风险

以下安全风险并非TinyMCE特有,而是允许用户输入的网站或应用程序的主要安全风险。保护服务和用户免受这些风险需要服务器端处理。请注意,攻击者可能会绕过任何编辑器直接攻击服务器,而不是使用文本编辑器作为载体。

有关缓解这些风险的信息,请参阅每个部分中提供的链接。

跨站脚本攻击(XSS)

跨站脚本攻击(XSS)涉及使用网站或应用程序输入注入恶意的客户端代码。此代码可用于攻击用户。

尽管TinyMCE会过滤编辑器内容中的脚本等内容,但应采取预防措施保护用户,如启用内容安全策略(CSP)和服务器端过滤。

有关跨站脚本攻击以及如何降低攻击风险的信息,请参阅:OWASP Top Ten 2017 — 跨站脚本攻击(XSS)。

注入

注入攻击涉及攻击者使用网站或应用程序输入运行服务器端代码,如SQL、NoSQL或LDAP脚本。

如果用户输入在服务器端未正确过滤,主机设备和用户数据可能会受到损害。

有关注入相关安全问题以及如何降低攻击风险的信息,请参阅:OWASP Top Ten 2017 — 注入。

清理HTML输入以防止XSS攻击

以前,在HTML内容传递给TinyMCE 5.x之前,它是使用内部开发的API SaxParser解析的。

SaxParser API是在当时没有替代方案的情况下开发的。

当启用此API的validate设置 — validate: true — SaxParser会删除不符合声明的架构的元素和属性。

在其生命周期中,SaxParser被扩展。例如,从TinyMCE 5.9开始,SaxParser API将具有某些名称或ID的属性标记为不安全,因为某些名称或ID可能导致主机浏览器覆盖现有属性或函数。

从TinyMCE 6.0开始,这个基本解析器被移除,并用两个更彻底的替代方案替换:

  1. 原生浏览器API DOMParser();以及

  2. 用于 HTML、MathML 和 SVG 的免费开源 XSS 清理器,DOMPurify。

TinyMCE 使用 DOMPurify 3.x 版本,这是在 TinyMCE 8 开发时使用的当前版本。

在 HTML(或 XML)内容传递给 TinyMCE 8 之前,DOMParser API 会将 HTML(或 XML)字符串解析为 DOM 对象。在此过程中,DOMParser 会尝试纠正格式错误的 HTML。

例如,以下字符串:

<p>
<a href="https://example.com">Click here.
</p>

当传递此字符串时,DOMParser API 会添加缺失的闭合锚标签:

<p>
<a href="https://example.com">Click here.</a>
</p>

接下来,这个现在格式正确的 DOM 对象会传递给 DOMPurify。

DOMPurify 会在 DOM 对象上运行以安全为重点的规则集,以清理 HTML 并保护 TinyMCE 及使用 TinyMCE 的应用程序免受 XSS 攻击。

关闭 DOMPurify

DOMPurify 清理默认开启,且在 TinyMCE 6.4 之前无法关闭。

然而,从 TinyMCE 6.4 开始,可以使用 xss_sanitization 选项关闭 DOMPurify。

xss_sanitization 默认设置为 true。也就是说,即使 TinyMCE 配置中未声明此选项,TinyMCE 也会专门将 xss_sanitization 选项设置为 true。

类型: Boolean

默认值: true

可能的值: true,false

示例:使用 xss_sanitization 关闭 DOMPurify 并停止对 HTML 进行 XSS 攻击清理
tinymce.init({
  selector: 'textarea',  // 根据 HTML 修改此值
  xss_sanitization: false
});
关闭 DomPurify 会使 TinyMCE 及任何使用 TinyMCE 的应用程序极易受到 XSS 攻击。只有在具备替代且功能相当的 HTML 和 XML 清理及 XSS 防护措施时,才应关闭 DomPurify。

TinyMCE 8.0.1 将 DOMPurify 升级至 3.2.6 版本,并默认启用 SAFE_FOR_XML 标志。这强制执行更严格的清理,可能会移除或更改以前在 TinyMCE 7 中可通过的内容。有关更多信息,请参阅 迁移指南

保护嵌入式外部资源

sandbox_iframes

此选项允许控制 <iframe> 元素在插入编辑器时是否进行 沙盒化。启用后,所有 <iframe> 元素都会获得 sandbox="" 属性,应用所有限制。

类型: Boolean

默认值: true

可能的值: true,false

示例:使用 sandbox_iframes 选项

tinymce.init({
  selector: 'textarea',  // 根据 HTML 修改此值
  sandbox_iframes: false
});

convert_unsafe_embeds 选项

此选项控制 <object> 和 <embed> 元素是否将转换为限制性更强的替代元素,即图像 MIME 类型转换为 <img>,视频 MIME 类型转换为 <video>,音频 MIME 类型转换为 <audio>,或其他或未指定的 MIME 类型转换为 <iframe>。

当转换为 <img>、<video> 或 <audio> 时,这将防止嵌入式资源执行潜在的恶意操作,包括脚本编写、文件下载、浏览器弹出窗口、绕过同源策略等。此外,启用 sandbox_iframes 选项以确保 <iframe> 转换也被中和。

类型: Boolean

默认值: true

可能的值: true,false

示例:使用 convert_unsafe_embeds 选项

tinymce.init({
  selector: 'textarea',  // 根据 HTML 修改此值
  convert_unsafe_embeds: false
});

allow_html_in_comments

allow_html_in_comments 选项允许在编辑器内容中的注释中保留类似 HTML 的内容。默认情况下,TinyMCE 会移除包含类似 HTML 内容的注释作为安全措施。

类型: Boolean

默认值: false

可能的值: true,false

将此选项设置为 true 可能会使应用程序暴露于 XSS 漏洞。DOMPurify 维护者已发现在注释中允许类似 HTML 的内容时存在潜在安全风险。仅当您信任内容来源并了解安全影响时,才启用此选项。

示例:使用 allow_html_in_comments

以下示例演示了默认情况下(移除)如何处理包含 HTML 的注释,以及如何配置 TinyMCE 以保留它们:

tinymce.init({
  selector: 'textarea',
  allow_html_in_comments: true,  // 在注释中启用 HTML
});

数据的不安全传输与存储

在没有强大加密保护的情况下传输或存储数据,会使此内容暴露于攻击者面前。

将不安全的内容加载到编辑器中,或通过不安全的连接从编辑器提交内容,会使用户和主机服务器遭受攻击。

有关敏感数据泄露问题以及如何降低攻击风险的信息,请参阅:OWASP Top Ten 2017 — 敏感数据泄露。

失效的身份验证和会话管理

失效或实施不当的身份验证和会话管理会将用户数据和服务器暴露给攻击者,使他们能够冒充用户,包括管理员。

失效的身份验证或会话管理可能允许攻击者以被攻陷的用户账户身份,通过编辑器或任何输入字段更改或提交数据。

有关失效的身份验证问题以及如何降低攻击风险的信息,请参阅:OWASP Top Ten 2017 — 失效的身份验证。

使用带有已知漏洞的组件

在您的网站或应用程序中使用过时的组件会使攻击者能够利用已知漏洞。

发现漏洞时,TinyMCE 会进行修补。保持 TinyMCE 和其他依赖项为最新版本,将使您和您的用户免受已知漏洞的威胁。

有关使用带有已知问题组件的相关信息以及如何降低攻击风险的信息,请参阅:OWASP Top Ten 2017 — 使用带有已知漏洞的组件。

更多安全信息

如需有关保护您的网站或应用程序的一般安全建议,请访问 Open Web Application Security Project (OWASP)。