2013-08-16 122 views
0

我有一種情況,我將外部HTML加載到網頁上的所見即所得編輯器中。外部HTML來自可信來源,幷包含來自多個不同頁面的兩個特定<div>標記之間的內容。防止內聯JS執行

我的問題是,一些頁面包含內嵌JavaScript事件處理程序。所以當我在WYSIWYG編輯器中工作時,某些事件會導致執行這個js。

大多數情況下,它不會做任何事情,除了填寫控制檯錯誤說... is not defined,這可能是全部的,這不會是一個問題。但是,它仍然很混亂,我不知道是否沒有可能執行類似alert(...)這樣的頁面,這可能會變得非常煩人。代碼都是可信的,但是與其預期的背景脫離,可能會產生不良結果。

我想找到一種方法來全局阻止執行,最好不用修改內聯腳本。我可以爲每個處理程序執行一些操作,例如attach =false;,但是我必須檢查所有傳入的元素,即使使用正則表達式,這也會降低性能。另外,在將編輯過的HTML提交給服務器之前,我必須將其刪除,這似乎是一個很大的麻煩,而且很難做到完美無瑕。

有沒有辦法阻止在這個特定的上下文中執行這個在線代碼?

+0

這一切都取決於你如何加載內容。通常,當片段添加到DOM時,頁面片段中的內聯腳本不會被**評估。如果他們正在被評估,那是因爲你的一些代碼(或者你正在使用的一個庫)正在這樣做。 – Pointy

+0

我使用$ .jqte插件來創建所見即所得的編輯器。我的猜測是這是源代碼,因爲它必須先編輯內容,然後再編輯它。這是我想要的。否則,我可以剝去所有標籤或輸出沒有標籤的內容。我現在才意識到,角度或類似的東西將會是這方面的正確工具,但我認爲我有點太過分了。 – user1167442

回答

0

我從sitepoint forum複製了這個問題,類似於你的問題。這需要將div從父項中拉出並重新放回。如果這是你想要的是這裏的示例代碼:

var div = document.getElementById('div'); 
var nextSibling = div.nextSibling; 
var parent = div.parentNode; 
parent.removeChild(div); 
function reCreateElement() { 
    if (nextSibling) { 
     parent.insertBefore(div, nextSibling); 
    } else { 
     parent.appendChild(div); 
    } 
} 
setTimeout(reCreateElement, 100); 

// Below is the stuff we don't want to run! 
document.getElementById('div').onclick = function() { 
alert('CLICKED!'); 
} 
+0

這會強制我試圖避免的額外編碼。 – user1167442

1

根據您嘗試支持的瀏覽器,您可以簽出'內容安全策略'標頭。有關瀏覽器支持的詳細信息,請參見結賬http://caniuse.com/contentsecuritypolicy

如果您的目標瀏覽器在列表中,CSP可以完全按照您的要求進行操作。它將默認禁用事件處理程序。除阻塞事件處理程序之外,它將阻止嵌入頁面中的任何代碼的執行。所以你需要將所有的js代碼(如果在html頁面上存在的話)移動到一個單獨的js中,在安全列表中指定該文件名並從那裏加載你的js。

CSP被設置爲Http標頭,但是新標準也可以使用meta標籤進行設置。結帳https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#html-meta-element--experimental

對於WebKit支持的瀏覽器(Chrome/Safari),如 會限制來自任何外部源的負載。您可以將已接受的來源列表添加到列表中,並探索適合您的功能。

對於firefox,雖然它在規範中有,但我不認爲中間標籤是受支持的。 https://developer.mozilla.org/en-US/docs/Security/CSP/Introducing_Content_Security_Policy。總之,只要您可以爲託管網頁的Web服務器設置標頭(除非您只需要Chrome/Safari支持),並且您的目標瀏覽器支持CSP,那麼您可以給它一個鏡頭。

+0

不幸的是,這不起作用,但很好考慮。 – user1167442