2017-12-27 680 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實際上與