2017-12-27 681 views
3

我已经阅读了有关的相关问题div contenteditable, XSS,但其答案并没有强调关于XSS的contenteditable安全问题。特别是关于意外(与内部跨站脚本相比)。当然,我知道我应该清理用户输入服务器端。HTML5的contenteditable属性应该是XSS安全吗?

TL.DR.:我可以肯定的是,用户并不突出风险引入一些外部脚本(即通过从剪贴板粘贴的数据。)通过页面元素被设置contenteditable?规范是否确保粘贴到contenteditable的任何标记在插入到DOM之前都已经过消毒处理?

我注意到,在我试验了两种主要的浏览器,铬/ Chrome和Firefox,这似乎是不可能的意外插入活性元素contenteditable标签。

  • 用户复制DOM元素从一个网页上的选择和它们插入contenteditable元素在其他网站上:对于这样的斯瓦特插入我会想到是例如一个例子。
  • 用户在(在Linux命令行上)echo "<b onclick='alert("XSS");'>click me</b>" | xclip -t text/html -selection "clipboard"并将其粘贴到contenteditable中。

一种有源元件将是类似的东西:

  • 包含含有与内联处理程序如onclick="alert(\"XSS\");"
  • 包含JavaScript的HREF诸如HTML的标记元素一个<script>
  • HTML标记的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)。

UPDATE 2 最近的参考/规格上MDN引用是https://html.spec.whatwg.org/multipage/interaction.html#contenteditable 是奇怪淡漠任何保证contenteditable提供到不经由浆料引入的恶意的JavaScript。

+3

只要你在服务器端清理输入,我不明白为什么有人在'contenteditable'中粘贴JavaScript就是一个问题。任何人都可以打开开发工具并在页面上执行任何可能足以应对XSS攻击的JavaScript(如果服务器端未设置为防止此类攻击)。 –

+0

@DeepakKamat我想(假设用户已经登录并且有一定的权限来删除内容),如果粘贴一个恶意脚本会继承这个特权,我会认为这是有问题的。你打算说什么?此外,我假设XSS安全还会覆盖用户数据(如他的输入数据)的安全性,如果可能,通过'contenteditable'可能会将恶意脚本发送给恶意第三方。当然,它的服务器是不妥协的,但在我的理解中,攻击用户帐户/数据的XSS不好,因此我担心 – humanityANDpeace

+0

为什么从9年半前阅读规格而不是当前规格? – BoltClock

回答

0

没有标准,它的浏览器一定要坚持,所以每个浏览器都会有自己的处理用户输入的实现。如果有办法,你可以确定用户将会知道如何去做(旧版浏览器通常是最容易受影响的)。这要取决于你清理用户的输入,无论是来自打字,粘贴等(我必须为一个项目执行此操作,因为没有办法依靠它“正常工作”)。

至于将designMode,你链接的部分:

当脚本是在脚本被禁用脚本执行上下文中执行脚本必须什么也不做,什么也不返回(返回值为空)。

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

这将使它看起来的designMode让你“安全”,但要记住,规格随着时间的演变,所以没有回去和测试所有不同的浏览器(或至少用户都使用的),你可以从来不确定。

+0

我已经测试了“安全”,通过'document.designMode = “on”,并没有像预期的那样行事。 https://stackoverflow.com/q/47996078/1711186 – humanityANDpeace

+0

Gmail在其html5用户界面中使用了'contenteditable',所以我无法想象任何潜在的XSS或HTMLInjection https://davidyat.es/2016/02/16/contenteditable /问题留给浏览器完成。对我来说,任何浏览器执行contenteditable的方法都会以粘贴内容不会冒数据泄露的风险的方式来实现它。没有标准的答案是令人震惊或虚假,或有风险:) – humanityANDpeace

+0

我会说可怕的!但相信我,我通过阅读关于表单元素,输入事件的w3规范的文档浏览了几个小时,并且仅仅为了得出它是特定于实现的。 http://www.w3.org/TR/#w3c_all我使用contentEditable工作在一个类似于GMail的基于HTML的邮件系统上,因为我们希望我们自己的JS仍然在内部运行,所以我们没有使用designMode。 contentEditable实际上与