HTML5的contenteditable属性是否应该是XSS安全的?

时间:2017-12-27 16:29:12

标签: javascript html5 xss contenteditable sanitization

我已经阅读了一些相关的问题div contenteditable, XSS,但它的答案并未突出显示关于可信任的XSS安全性。特别是在意外方面(与内部跨站点脚本相比)。当然,我知道我应该清理用户输入服务器端。

TL.DR。:我是否可以确定用户没有风险通过设置的页面元素{{1}引入一些外部脚本(即通过剪贴板粘贴的数据) }?规范是否确保粘贴到contenteditable的任何标记在插入DOM之前都要进行清理?

我注意到在我测试的两个主要浏览器Chromium / Chrome和Firefox上,似乎不可能意外地将活动元素插入contenteditable标记。例如,我想象的这种加入插入的一个例子是:

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

活动元素类似于:

  • 包含contenteditable
  • 的html标记
  • html标记,包含带有内联处理程序的元素,例如<script>
  • 包含javascript hrefs的html标记,例如onclick="alert(\"XSS\");"

现在我的问题是,如果设计符合正常的XSS载体那么看起来有点可信吗?

我已经阅读了一些specs/refs/whatever,它没有明确提到<a href="javascript:alert(\"XSS\")"> click me </a>应该阻止任何活动元素插入到页面的DOM中,也不会是允许。这使我怀疑是否应该使用contenteditable功能,因为我不想冒一些外部JavaScript被插入contenteditable的风险。回答contenteditable的XSS安全性是这个问题的核心。

更新contenteditable属性相比,类似的功能文档contenteditable似乎是特定的(请参阅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 对于designMode提供的不通过粘贴引入恶意javascript的任何保证,这是奇怪的无动于衷。

1 个答案:

答案 0 :(得分:0)

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

至于designMode,您链接的部分:

  

当要在禁用脚本的脚本执行上下文中执行脚本时,脚本必须不执行任何操作并且不返回任何内容(void返回值)。

     

因此,例如,启用designMode将禁用由文档中的脚本设置的任何事件处理程序属性,事件侦听器,超时等。

这会使看起来像designMode让你安全&#34;但请记住,规格随着时间的推移而演变,所以不用回去测试所有各种浏览器(或者至少是你的用户拥有的浏览器),你永远不能确定。