【发布时间】:2018-06-08 07:05:19
【问题描述】:
我已经阅读了一些相关的问题div contenteditable, XSS,但它的答案并没有突出显示 contenteditable 的 XSS 安全性。特别是关于意外(与有意的跨站点脚本相比)。当然,我知道我应该在服务器端清理用户输入。
TL.DR.:我能否确定用户不会冒着通过设置contenteditable 的页面元素引入一些外部脚本(即通过从剪贴板粘贴的数据)的风险?规范是否确保粘贴到 contenteditable 的任何标记在插入 DOM 之前都经过清理?
我注意到在我测试的两个主要浏览器 Chromium/Chrome 和 Firefox 上,似乎不可能意外地将 活动元素 插入到 contenteditable 标记中。我想象的这种附带插入的例子是:
- 用户从一个网页复制一个 DOM 元素选择并将它们插入到另一个站点上的
contenteditable元素中。 - 用户执行(在 linux 命令行上)
echo "<b onclick='alert("XSS");'>click me</b>" | xclip -t text/html -selection "clipboard"并将其粘贴到contenteditable。
活动元素可以是:
- html 标记包含
<script> - html 标记包含带有内联处理程序的元素,例如
onclick="alert(\"XSS\");" - 包含 javascript href 的 html 标记,例如
<a href="javascript:alert(\"XSS\")"> click me </a>
现在我的问题是,看到 contenteditable 似乎可以避免粘贴任何正常的 XSS 矢量,如果这是设计使然的话?
我读过一些specs/refs/whatever,其中既没有明确提到contenteditable 应该阻止任何活动元素 插入页面的DOM,也不允许这样做。这让我怀疑我是否应该使用 contenteditable 功能,因为我不想冒险将一些外部 javascript 插入到contenteditable 中。回答contenteditable这个XSS安全是这个问题的核心。
更新
与contenteditable 属性相比,类似的特性文档designMode 似乎是特定的(参见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 的任何保证,这奇怪的是漠不关心。
【问题讨论】:
-
只要你清理服务器端的输入,我不明白为什么有人在
contenteditable中粘贴 JavaScript 甚至是一个问题。任何人都可以打开开发工具并在页面上执行任何足以引发 XSS 攻击的 JavaScript,如果服务器端没有设置为防止这种情况发生。 -
@DeepakKamat 我想(假设用户已登录并具有某些特权,例如删除内容),如果粘贴恶意脚本会继承此特权,我会认为这是有问题的。你打算说什么?此外,我假设 XSS 安全还涵盖了恶意脚本的用户数据(例如他的输入数据)的安全,如果可能的话,通过
contenteditable可能会 xhr/将内容发送给恶意第三方。服务器不受影响当然很好,但据我了解,攻击用户帐户/数据的 XSS 也很糟糕,因此我担心 -
您为什么要阅读 9 年半前的规范而不是当前规范?
-
@BoltClock 如果有更新的规范,我一定是错过了它,你的观点是正确的。除了我引用的规范仍然是我的搜索引擎为我提供的第一个规范。我还找到了w3c.github.io/editing/contentEditable.html。以防万一您能够指出更新的规范(如果存在)?
标签: javascript html xss contenteditable sanitization