2009-06-23 103 views
0

我目前正在開發一個應用程序,要求用戶提交在網站上顯示的帖子和評論。因爲我們都知道用戶輸入不可信,所以我使用htmlspecialchars($ string,ENT_QUOTES)來處理用戶的帖子和評論。PHP中的用戶輸入過濾

現在,我想要忽略某些特定的html標記。如<b><br />和更多標籤。我該怎麼做才能讓htmlspecialchars在過濾其他標籤時忽略一些標籤。

+0

如...?似乎SO不想顯示這些標籤,) – erenon 2009-06-23 10:29:56

回答

3

溶液)
使用用strip_tags insted的用htmlspecialchars,並列入白名單所需的標籤。
更好的解決方案B)
使用bbcodes,並給別名到想要的標籤,e.g:[B]大膽[/ B]

1

,可隨時更換引號的字符串重新插入允許的標籤。對於<b>標籤例如:

$string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string); 

我將只允許非常明顯的,完整的標籤是儘可能安全。即如果你不需要使用正則表達式,它可能導致非常討厭的錯誤。

2

它是非常非常困難只允許一些HTML標籤,而不允許任何腳本注入或類似的可能性。

我實際上建議避免這種情況,並使用生成HTML的東西,如this UBB code parser(或類似)。甚至Markdown(關閉HTML選項)。

這不會給攻擊者造成攻擊你網站的空間,如果它是面向公衆的,這是非常重要的。

如果您甚至允許通過一些HTML,那麼確定的攻擊者可能會找到一個方法。

2

由於目前的缺陷或不安全的HTML過濾器的使用情況,厭倦了使用BBCode?
- > HTML Purifier

HTML淨化器是一個用PHP編寫的符合標準的HTML過濾器庫。 HTML淨化器不僅會刪除所有惡意代碼(更好地稱爲XSS)與一個經過充分審計,安全但寬鬆的白名單,...
+0

瞭解到這個昨天和整個安全噩夢領域得到解決。 – 2010-05-03 20:04:34

0

這不像您可能的事那麼簡單,因爲htmlspecialchars()htmlentities()都不提供任何選項忽略某些標籤(兩種功能甚至不知道標籤的概念的含義)。

您可以使用其他方式讓用戶格式化他們的帖子,例如, BBCodeTextileMarkdown。有PHP解析器可用於所有這些解析器。

如果您必須堅持使用html標籤,您可以採取一些預處理,重新格式化允許的標籤,以便它們不會受到htmlspecialchars()的影響。然後,您可以對結果進行後處理,將格式更改回普通的HTML標籤。以下示例將該過程可視化爲一個簡單的<a>標籤。請注意,使用正則表達式處理HTML很容易出錯,並不總是如此 - 我只是爲了簡單起見才使用它。

$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input); 
$input = htmlspecialchars($input); 
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input); 

這是未經測試的,肯定需要更多的工作。