javascript - HTML5 的 contenteditable 属性应该是 XSS 安全的吗?

标签 javascript html xss contenteditable sanitization

我已经阅读了有点相关的问题 div contenteditable, XSS ,但它的答案并没有突出太多关于 contenteditable 的 XSS 安全性。特别是关于意外(与有意的跨站点脚本相比)。我当然知道我应该在服务器端清理用户输入。

TL.DR.:我可以确定用户不会冒通过设置为 contenteditable 的页面元素引入一些外部脚本(即通过从剪贴板粘贴的数据)的风险吗?规范是否确保粘贴到 contenteditable 的任何标记在插入 DOM 之前都经过清理?

我注意到在我测试的两个主要浏览器 Chromium/Chrome 和 Firefox 上,似乎不可能不小心将 active Elements 插入到 contenteditable 标记中。我想象的这种意外插入的一个例子是:

  • 用户从一个网页复制了一系列 DOM 元素,并将它们插入到另一个站点的 contenteditable 元素中。
  • 用户执行(在 linux 命令行上)echo "<b onclick='alert("XSS");'>click me</b>" | xclip -t text/html -selection "clipboard" 并将其粘贴到 contenteditable 中。

事件元素可以是:

  • 包含 <script> 的 html 标记
  • 包含带有内联处理程序的元素的 html 标记,例如 onclick="alert(\"XSS\");"
  • 包含 <a href="javascript:alert(\"XSS\")"> click me </a> 等 javascript href 的 html 标记

现在我的问题是,看到 contenteditable 似乎有点安全,不会将任何正常的 XSS 向量粘贴到其中,如果这是设计使然的话?

我读过一些 specs/refs/whatever,其中既没有明确提到 contenteditable 应该阻止任何事件元素被插入到页面的 DOM 中,也没有提到它是不允许的。这让我怀疑我是否应该使用 contenteditable 功能,因为我不想冒险将一些外部 javascript 插入到 contenteditable 中。回答这个contenteditable的XSS安全是本题的核心。

更新 与类似功能文档 contenteditabledesignMode 属性相比,似乎具体(参见 https://www.w3.org/TR/2008/WD-html5-20080610/web-browsers.html#designModeScriptBlocked )关于 javascript 被禁用(因此 XSS 被阻止)。

更新 2 MDN 上引用的最新引用/规范是 https://html.spec.whatwg.org/multipage/interaction.html#contenteditable 奇怪的是,它对 contenteditable 提供的不通过粘贴引入恶意 javascript 的任何保证漠不关心。

最佳答案

没有浏览器必须遵守的标准,因此每个浏览器都有自己的处理用户输入的实现。如果有办法,您可以确定用户会弄清楚如何去做(旧浏览器通常最容易受到影响)。由您来清理用户的输入,无论是来自键入、粘贴等。(我必须为一个项目执行此操作,您无法依赖它“正常工作”)。

至于 designMode,您链接的部分:

When a script is to be executed in a script execution context in which scripting is disabled, the script must do nothing and return nothing (a void return value).

Thus, for instance, enabling designMode will disable any event handler attributes, event listeners, timeouts, etc, that were set by scripts in the document.

这会让设计模式看起来让你“安全”,但请记住,规范随着时间的推移而发展,所以如果不回头测试所有不同的浏览器(或者至少是你的用户拥有的浏览器),你永远无法确定.

关于javascript - HTML5 的 contenteditable 属性应该是 XSS 安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47995512/

相关文章:

html - CSS 绝对响应式导航

javascript - 跨浏览器 HTML5 拖放 JSON 数据传输失败

javascript - CSS :hover with JS problem

html - 当用户鼠标悬停在用户名上时如何设计页眉样式显示注销

javascript - 在排行榜中回响

java - BufferedReader 空引用

Codeigniter - 在发布的基础上禁用 XSS 过滤

javascript - 在输入值中设置图像

javascript - 使用 jQuery 将复选框值添加到隐藏字段

javascript - [variable].onclick = function () 没有执行,控制台没有错误