2017-07-14 25 views
-1

我一直在這個關閉幾天,但我的RexEx掌握不是很好。是的,我明白RegEx不適用於解析HTML。我正在做CKEditor輸入的服務器端「清理」,已經這樣做了,但只有客戶端。RegEx查找並刪除事件屬性前。 onclick,onload,onhover等

條帶化沒有列入白名單的標籤後...

第一:$html = preg_replace(' on\w+=(["\'])[^\1]*?\1', '', $html);刪除所有的事件屬性妥善要麼'"報價引述

二:$html = preg_replace(' on\w+=\S+', '', $html); *刪除沒有引號的那些但仍然可以開火,例如。的onclick = blowUpTheBase()

我想這樣做是保證的onEvent是< & >之間,但我只能得到它,如果的onEvent屬性標籤後的第一個工作。我所嘗試的一切最終都會捕獲大部分代碼。我只是不能很懶。

ex。 $html = preg_replace('<([\s\S]?)(on\w+=\S+) ([\s\S]*?)>', '<$1 $3>', $html);

編輯: 我要選擇@ colburton的答案,因爲RegEx是我所要求的。我也會將它用於我的特殊情況,因爲它會應付詭計。 (這無論如何是一個內部應用程序)

我要感謝@Casimir等伊波利特他answer,因爲它提供了有關如何做到這一點的「正確的方式」一個很好的例子和說明。我將在短期內使用DOMDocument編寫一個函數,它將成爲我處理RTE/WYSIWYG/HTML輸入的轉換方式。

+0

的'[^ \ 1]'不爲工作你認爲它的確如此。你需要使用'(?:(?!\ 1)。)*'來代替。此外,你應該使用正則表達式分隔符。 –

+0

引用問題和屬性位置是爲什麼用正則表達式解析你的html是一個壞主意的兩個原因。當您使用DOMDocument時,這些問題不存在。將你的HTML內容封裝在假根元素中,假設'

....
'並在解析器中使用此構建。 –

+0

還要注意,你不能信任外部數據,所以如果已經有一部分應該在客戶端完成的清理工作,那麼你必須在服務器端再做一次或者至少檢查一次。 –

回答

0

也許我應該從一開始就提到這一點:這不是你應該如何嘗試過濾XSS。在您提出的參數中,這完全是理論上的(例如「使用RegEx」)。


這也相當接近:

preg_replace('/(<.+?)(?<=\s)on[a-z]+\s*=\s*(?:([\'"])(?!\2).+?\2|(?:\S+?\(.*?\)(?=[\s>])))(.*?>)/ig', "$1 $3", $string); 

測試在

<a href="something" onclick="bad()">text</a> onclick not in tags 
<a href="something" onclick=bad()>text</a> 
<a href="something" onclick="bad()" >text</a> 
<meta name="keywords" content="keyword1, keyword2, keyword3"> 

<a href="something" onclick= "bad()">text</a> onclick not in tags 
<a href="something" onclick =bad()>text</a> 
<a href="something" onclick=bad('test')>text</a> 
<a href="something" onclick=bad("test")>text</a> 
<a href="something" onclick="bad()" >text</a> 
What if I write john+onelia=love forever? 

玩在這裏: https://regex101.com/r/GMBaQs/9

+0

幾個計數器示例:https://regex101.com/r/GMBaQs/2 –

+0

@Casimir:Thx用於輸入。讓我們再來一輪;-) – colburton

+0

它推動它,但是,https://regex101.com/r/GMBaQs/5獲得一個通過。感謝迄今爲止的答案,讓我感到羞恥。 – Chad