2012-09-19 181 views
2

我從一個不可信的源代碼下載了一些html樹,並使用它僅顯示內容作爲我頁面中某些HTML div的子節點。但是,下載的代碼有可能在事件處理程序中運行腳本/或執行腳本。是否有可能在HTML一樣,使用標籤來定義腳本,做一個HTML Javascript - 防止從dom樹的子節點執行腳本

<noscriptex> 
    <script> 
     ... 
    </script> 
</noscriptex> 

那麼瀏覽器就不會這個標籤中執行任意代碼?

如果沒有這樣的事情,我如何清理下載的HTML只是爲了顯示帶有CSS的DOM元素而不涉及任何腳本?

+0

您需要重新考慮這一點並在顯示之前對輸入進行清理。這樣的代碼只是在等待被利用。 – Blender

+0

@Blender:這正是他要求的, – SLaks

+0

@Slaks:我的不好。我不知何故錯過了問題的最後一段...... – Blender

回答

1

否;沒有這樣的功能。

相反,您需要解析HTML並使用嚴格的白名單刪除任何無法識別的標記和屬性。

您還需要驗證屬性值;特別是URL。

+0

無需解析,DOM可以用來查找和刪除腳本元素而不執行它們。屬性值更難處理,也許所有的處理程序(*)都可以設置爲undefined? – RobG

+0

@RobG謝謝你,這是一個更好的建議,但代碼和數據共同居住卻是可憐的,但對文件系統或虛擬內存代碼和數據頁面等數據沒有執行保護。 我不確定是否所有的處理程序都可以設置爲undefined,甚至在至少調用了onLoad a la onCreate類型的某些處理程序之前。 – foobarometer

+0

@SLaks寫一個解析器是很昂貴的,但我正在考慮它。 – foobarometer

1

您可以使用函數從標記中刪除腳本,例如,

function stripScripts(markup) { 

    var div = document.createElement('div'); 
    var frag = document.createDocumentFragment(); 

    div.innerHTML = markup; 

    var scripts = div.getElementsByTagName('script'); 
    var i = scripts.length; 

    while (i--) { 
     scripts[i].parentNode.removeChild(scripts[i]); 
    } 

    while (div.firstChild) { 
     frag.appendChild(div.firstChild); 
    } 
    return frag; 
} 

任何使用innerHTML插入的腳本元素都不會執行,所以它們是安全的。他們不在DOM中,或者權力有限。

請注意,由createDocumentFragment返回的對象可以直接插入到DOM中,並且函數返回的片段沒有腳本元素。

+0

保持在請注意,除'

  • 11. 防止執行cgi/perl腳本
  • 12. 從javascript dom文本節點替換 
  • 13. javascript執行後從DOM獲取html
  • 14. htaccess的子目錄,以防止腳本執行
  • 15. 防止節點上的某些類型的節點Primefaces樹
  • 16. 防止從執行
  • 17. 防止從執行
  • 18. 從html執行python腳本
  • 19. 從HTML執行Webdriver腳本
  • 20. 防止PHP過早執行HTML表單腳本
  • 21. 如何防止jQuery.dialog將對話節點移動到DOM樹的末尾?
  • 22. 防止子節點的鼠標事件
  • 23. 解釋HTML DOM樹>子節點概念簡單
  • 24. 的Javascript:防止子類的功能是從父函數執行
  • 25. 防止JavaScript GET和腳本
  • 26. HTML無法訪問的DOM節點,Javascript?
  • 27. 防止子級iframe腳本的父級DOM操作
  • 28. 從DOM樹中提取節點值
  • 29. Bash - 防止腳本在錯誤時停止執行
  • 30. 節點exec無權執行腳本