[英]Cleaning all inline events from HTML tags
對於HTML輸入,我要中和所有具有內聯js的HTML元素(onclick =“ ..”,onmouseout =“ ..”等)。 我在想,對下面的字符進行編碼還不夠嗎? =,(,)
因此onclick =“ location.href ='ggg.com'”
將成為onclick%3D“ location.href%3D'ggg.com'”
我在這里想念什么?
編輯:我確實需要接受活動的HTML(我無法對其全部或實體進行轉義)。
沒有簡單的方法可以接受HTML,但不能接受腳本。
您必須將HTML解析為DOM,刪除DOM中所有不需要的元素和屬性,並生成新的HTML。
on
*屬性是不夠的。 腳本可以嵌入到style
, src
, href
和其他屬性中。
如果您使用的是PHP,請使用HTML Purifier 。
您可能有兩個選擇……最簡單的方法是將引號(可能還有<>字符)轉換為它們的HTML編碼等效項(“等”),這將導致HTML代碼按字面顯示。
告訴我您正在使用哪種服務器端語言,如果您願意,我可以為您提供更多特定於語言的信息。 (例如,PHP具有htmlspecialchars()[1])。
編輯:我真的讀了你的問題。 好的,您要允許HTML通過但不允許JavaScript嗎? 好吧,由於缺少一個簡單的解決方案,我建議僅使用字符串替換(如果可以,則使用正則表達式)來完全擺脫它們。
JavaScript中有一組有限的事件處理程序屬性。 再加上引號,您可能會很好。
為了進行概念驗證,在Perl中,您可能會執行以下操作:
$myInput =~ s/on(mouseover|mouseout|click|focus|blur|[...])(\"[^\"]*\")|(\'[^\']*\')\s*//gi;
因此,捕獲事件處理程序名稱(僅包括其中的一部分),然后使用單引號或雙引號將其引起來的表達式包括在內,最后使用可選的空格,然后將整個內容替換為空(即刪除它)。
但是,這對於需要更多報價水平的東西將不起作用,因為最終您將回到原始的定界符。 原諒人為的,完全無用的示例:
onclick="eval('3+prompt("Enter a number: ")')"
在這種情況下,您可能想要編寫一個循環,該循環首先按單詞分析字符串(即,查找事件處理程序名稱),然后逐個字符地進行處理,跟蹤行進時的引用級別數並跟蹤當前的定界符:
這會花費一些時間,但是從理論上講,只要HTML格式正確,它就可以正常工作。 (這是一個可怕的假設,但是如果它的格式不正確,您仍然可以拒絕輸入!)
[1] http://us3.php.net/manual/zh/function.htmlspecialchars.php
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.