簡體   English   中英

從HTML標記清除所有內聯事件

[英]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 *屬性是不夠的。 腳本可以嵌入到stylesrchref和其他屬性中。

如果您使用的是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: ")')"

在這種情況下,您可能想要編寫一個循環,該循環首先按單詞分析字符串(即,查找事件處理程序名稱),然后逐個字符地進行處理,跟蹤行進時的引用級別數並跟蹤當前的定界符:

  1. 標記處理程序名稱開頭的索引(onclick中的“ o”等)
  2. 從報價級別0開始(或在處理了開頭報價定界符后為1)。
  3. 如果當前定界符為“,並且看到',則將引用級別增加1並將當前定界符切換為'。
  4. 如果當前定界符為“,並且看到”,則將報價水平降低1並將當前定界符切換為'。
  5. 如果當前定界符為'並且看到“,則將報價水平提高1並將當前定界符切換為'。
  6. 如果當前定界符為'並且您看到',將報價水平降低1並將當前定界符切換為'。
  7. 如果引用級別降為0,則您的字符串已結束。 標記字符串結束處的索引。
  8. 使用字符串操作函數從第一個索引到最后一個索引切出子字符串。

這會花費一些時間,但是從理論上講,只要HTML格式正確,它就可以正常工作。 (這是一個可怕的假設,但是如果它的格式不正確,您仍然可以拒絕輸入!)

[1] http://us3.php.net/manual/zh/function.htmlspecialchars.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM