以下是针对使用 TinyMCE 的网站或应用程序的相关通用安全建议。
概述
报告 TinyMCE 安全问题
我们为维护 TinyMCE 安全性所采取的措施
脚本和 XSS 漏洞
保持依赖项更新
安全保证与合规性
通过 HSTS 强制执行 HTTPS
为 TinyMCE 配置 Content Security Policy (CSP)
用户输入元素的一般安全风险
跨站脚本攻击 (XSS)
注入攻击
清理 HTML 输入以防止 XSS 攻击
保护嵌入的外部资源
数据传输和存储不安全
身份验证和会话管理失效
使用已知漏洞的组件
更多安全信息
报告 TinyMCE 安全问题
Tiny 重视安全研究人员为改善全球技术产品安全性所做出的工作。我们欢迎希望负责任地披露我们产品或系统中漏洞的研究人员。
请注意,我们不提供任何“漏洞赏金”计划,也不为披露的漏洞提供任何形式的报酬。
如需报告潜在的安全漏洞,请通过电子邮件联系我们的安全团队:infosec@tiny.cloud。
根据美国国家基础设施咨询委员会 (NIAC) 的漏洞披露框架(PDF 链接),Tiny 请求社区成员在报告潜在安全漏洞时,在 Tiny 调查该问题并采取行动修复之前,对其报告和发现保持保密。
Tiny 将与您沟通报告的状态,并在问题修复和披露后,经您许可,公开将该安全问题的发现归功于您。
我们为维护 TinyMCE 安全性所采取的措施
为保护 TinyMCE 用户,Tiny 采取以下措施:
修补跨站脚本攻击 (XSS) 漏洞,
保持 TinyMCE 依赖项更新,
提供关于通过 HSTS 强制执行 HTTPS 的建议,
提供有关如何配置适用于 TinyMCE 的 Content Security Policy 的信息。
脚本和 XSS 漏洞
TinyMCE 会过滤编辑器内容中的脚本等内容,但客户端应用程序可能会被攻击者绕过。Tiny 建议通过服务器端过滤器处理接收到的编辑器内容。
TinyMCE 不支持 SVG(可缩放矢量图形),以保护我们的用户及其最终用户。SVG 可用于执行客户端和服务器端攻击。
自 2020 年 1 月 1 日起,已修补的 XSS 漏洞的安全公告将发布在 TinyMCE GitHub 仓库的安全页面上。
保持依赖项更新
为保护我们的用户,Tiny 确保在发布下一个版本(主版本或次版本)之前更新 TinyMCE 的依赖项。
安全保证与合规性
Tiny 在 Tiny 信任中心中发布其安全和合规态势,包括其维护的框架。
信任中心还提供支持文档,如审计报告、渗透测试报告和已填写的安全态势问卷。这些文档可通过信任中心按需提供。
通过 HSTS 强制执行 HTTPS
Tiny 安全团队强烈建议嵌入 TinyMCE 的客户配置其 Web 服务器,以便为通过 HTTPS 提供服务的网站包含 HTTP 严格传输安全 (HSTS) 标头。这可以通过更新服务器配置以启用 HSTS 来实现。
HSTS 确保仅使用加密通信,降低降级攻击的风险,并增强对用户数据的保护。虽然对于 TinyMCE 来说,集成 HSTS 是可选的,但采用这一最佳实践可显著降低使用 TinyMCE 的项目中的漏洞风险。
如果没有 HSTS,访问网站的用户可能会受到中间人 (MITM) 攻击。攻击者可以利用此漏洞拦截未加密的 HTTP 流量,将用户重定向到恶意网站,或执行降级攻击以强制通过 HTTP 而非 HTTPS 进行连接。这种缺乏加密的情况会危及敏感用户数据的安全,包括凭据、会话 Cookie 和个人信息。通过启用 HSTS,浏览器将强制所有与该网站的后续交互使用安全的 HTTPS 连接,从而有效降低这些风险。
有关实施 HSTS 的全面指导,请参阅以下资源:
为 TinyMCE 配置 Content Security Policy (CSP)
TinyMCE 可与 CSP 标头一起使用。使用 CSP 时,以下指令对于 TinyMCE 的正常运行是必需的:
| 策略指令 | 原因 |
|---|---|
| 脚本有时会作为带有 src 属性的脚本元素加载。 |
| 样式有时需要内联或从外部域加载。 |
| 图片可以从自身、数据 URI 或 Tiny 的 CDN 加载。 |
| 字体可以从自身、数据 URI 或 Tiny 的 CDN 加载。 |
| 连接(如 AJAX 请求)可能需要与这些域进行通信。 |
用户输入元素的一般安全风险
处理用户输入元素时,需考虑以下安全风险。在处理用户输入时,TinyMCE 或您自己的应用程序应采取相应的防护措施:
跨站脚本攻击 (XSS)
XSS 攻击发生在攻击者将恶意脚本注入到其他用户查看的网页中时。这种攻击可能会导致会话劫持、敏感信息泄露或在用户不知情的情况下操纵网站。
注入攻击
当不受信任的数据作为命令或查询发送到解释器时,可能会发生注入攻击。这可能导致数据泄露、数据丢失或对系统进行未经授权的访问。
清理 HTML 输入以防止 XSS 攻击
为防止 XSS 攻击,应在处理用户输入时清理或转义 HTML 内容。TinyMCE 提供了一些工具,但应在服务器端进行最终清理。
保护嵌入的外部资源
在 TinyMCE 中嵌入外部资源(如 iframe、插件或第三方脚本)时,确保这些资源来自可信来源,以防止潜在的安全风险。
数据传输和存储不安全
确保敏感数据在传输和存储过程中经过加密。使用 HTTPS 进行数据传输,并使用加密方法存储敏感信息。
身份验证和会话管理失效
确保实施强大的身份验证机制和安全的会话管理。这包括使用强密码、多因素身份验证以及正确的会话失效和续期机制。
使用已知漏洞的组件
定期更新并检查 TinyMCE 及其依赖项中已知的漏洞。使用最新版本并应用安全补丁至关重要。
更多安全信息
有关 TinyMCE 安全的更多信息,请参阅 TinyMCE 安全文档。
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:
为所有
<script>元素使用nonce;每次页面加载时重新生成每个
nonce;重构内联事件处理程序,使其从JavaScript块添加;
不允许任何指令中使用
unsafe-inline值。然而,TinyMCE目前需要在
style-src指令中使用unsafe-inline值来呈现非纯文本内容。因此,目前不支持在严格CSP配置中运行TinyMCE。
此外,上述所需指令阻止从外部源加载任何内容。要允许来自特定源的内容,请将源域添加到相关指令。例如,允许YouTube视频:
media-src 'self' *.youtube.com;要允许来自任何源的内容,请使用(*)通配符。允许所有源(使用*)会取消该源类型的安全策略。例如:
media-src *;有关内容安全策略的信息,请参阅:MDN Web文档 - 内容安全策略(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十大风险2017 — 跨站脚本(XSS)。
注入
注入攻击涉及攻击者使用网站或应用程序输入运行服务器端代码,如SQL、NoSQL或LDAP脚本。
如果用户输入在服务器端未正确清理,主机设备和用户数据可能会受到损害。
有关注入相关安全问题的信息以及如何降低攻击风险,请参阅:OWASP十大风险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开始,这个基本解析器被移除,替换为两个更加全面的替代方案:
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,不再针对 XSS 攻击净化 HTML
tinymce.init({
selector: 'textarea', // change this value according to your 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', // change this value according to your 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', // change this value according to your 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 — Sensitive Data Exposure。
失效的认证与会话管理
失效或错误实施的认证与会话管理会使用户数据和服务器暴露于攻击者,使他们能够冒充用户,包括管理员。
失效的认证或会话管理可能允许攻击者通过编辑器或任何输入字段以被攻陷的用户账户更改或提交数据。
有关失效的认证问题以及如何降低攻击风险的信息,请参见:OWASP Top Ten 2017 — Broken Authentication。
使用已知漏洞的组件
在您的网站或应用程序中使用过时的组件会使攻击者利用已知的漏洞。
发现漏洞时,TinyMCE 会进行修补。保持 TinyMCE 和其他依赖项的最新状态将保护您和您的用户免受已知漏洞的影响。
有关使用具有已知问题的组件相关问题以及如何降低攻击风险的信息,请参见:OWASP Top Ten 2017 — Using Components with Known Vulnerabilities。
更多安全信息
有关保护您的网站或应用程序的一般安全建议,请访问 Open Web Application Security Project (OWASP)。