2010-09-11 100 views
18

我正在製作一個小型的HTML頁面編輯器。編輯器將文件加載到iframe中。從那裏,它可以使用新的屬性,樣式等來添加,修改或刪除頁面上的元素。問題在於JavaScript(和/或其他編程語言)可以在加載時完全修改頁面,之前你開始編輯元素。所以當你保存時,它不會保存原始標記,但修改後的頁面+你的更改。在iframe/div中禁用JavaScript

所以,我需要一些方法來禁用的iframe中的JavaScript,或者以某種方式消除所有的JavaScript的JavaScript的開始修改頁面之前。 (我想我必須最終解析PHP文件,但這不應該太難)我認爲編寫一個腳本來遍歷所有元素,刪除任何標籤,onclick,onfocus,onmouseover等等。但是,那將是一個真正的痛苦。

有誰知道一個更簡單的方式來獲得一個iframe中運行的JavaScript擺脫的?

更新:除非我已經錯過了一些東西,我相信沒有辦法簡單地「禁用JavaScript的。」如果我錯了,請糾正我。但是,我想唯一的方法是從請求的頁面字符串中解析出任何腳本標記和JavaScript事件(點擊,鼠標懸停等)。

+0

這一個談論的JavaScript遍歷頁面和刪除每次出現一個得到更多的信息-javascript-with-javascript.php – Dan 2010-09-15 19:46:15

+0

那篇文章談到了刪除腳本節點,我不相信會在加載腳本時執行「取消執行js」。 我真的不明白這個問題。什麼是文件加載到iframe中?你是否允許用戶在iframe中輸入任何html?你網頁上的所有javascript都來自哪裏?這聽起來像你可以控制文件的內容 – 2010-09-22 23:01:19

+0

「manticmoo」URL似乎不起作用,但它仍然可以通過Wayback Machine(archive.org)獲得:http://web.archive.org/web/ 20070128100901/http://www.manticmoo.com/articles/jeff/programming/javascript/removing-javascript-with-javascript.php – calvinf 2014-08-08 21:00:53

回答

1

您可以嘗試CKEditor採用的相同解決方案,其中您有演示here
通過從RTE模式切換到查看源代碼模式,您可以輸入一些JavaScript並查看結果,該結果是以安全編碼的字符串替換JS節點的結果。
如果你在查看源模式,通過輸入一些JS一行:

<script type="text/javascript"> 
// comment 
alert('Ciao'); 
</script> 

你會看到回去富文本編輯器模式時,它呈現的是這樣的:

<!--{cke_protected}%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0D%0A%2F%2F%20comment%0D%0Aalert('Ciao')%3B%0D%0A%3C%2Fscript%3E--> 

我認爲這是最簡單有效的方法之一,因爲RegExp解析JS節點並不複雜。
一個例子:

var pattern = /<script(\s+(\w+\s*=\s*("|').*?\3)\s*)*\s*(\/>|>.*?<\/script\s*>)/; 
var match = HTMLString.match(pattern); // array containing the occurrences found 

(當然,更換腳本節點應該使用replace()方法)。

問候。

+0

回答您的更新:是的,服務器端驗證任務是強制性的,但問題你可能想要在客戶端環境中解決的問題是iframe的不正確行爲,用戶可能會注入一些簡單的JavaScript來執行某些允許的操作。我對這個問題的實際經驗是,一個用戶在可編輯的iframe中輸入了一個簡單的腳本,用於從另一個域中的另一個iframe中導入表單,該表單導致編輯器頁面重定向到空白頁面。雖然導入的iframe在預覽中工作得很好,但插入代碼後編輯器無法訪問。 – 2010-11-27 21:17:57

4

是的,你的更新是正確的。您必須假設您從用戶收到的任何輸入可能包含惡意元素。因此,您必須必須在接受其輸入之前在服務器上進行驗證:-)

19

HTML5引入上(如果空)禁用JavaScript的加載和執行的IFRAME「沙箱」屬性。

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox

+0

雖然這是我尋找的解決方案,但請注意,它不僅僅是像OP所要求的那樣禁用JavaScript。 [看詳細(w3schools)](http://www.w3schools.com/tags/att_iframe_sandbox.asp) – MikeThomson 2015-06-11 18:13:57

+1

[更好的鏈接](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox)[mozilla.org] – Damien 2017-12-11 14:34:25

1

您可以設置內容安全策略腳本-SRC在頭 '自我'。 CSP將阻止除我們自己網站以外的任何腳本。這樣我們可以防止iframe中的任何腳本改變頁面中的元素。http://www.manticmoo.com/articles/jeff/programming/javascript/removing:

你可以從這裏http://www.html5rocks.com/en/tutorials/security/content-security-policy/