我目前正在開發一個應用程序,要求用戶提交在網站上顯示的帖子和評論。因爲我們都知道用戶輸入不可信,所以我使用htmlspecialchars($ string,ENT_QUOTES)來處理用戶的帖子和評論。PHP中的用戶輸入過濾
現在,我想要忽略某些特定的html標記。如<b><br />
和更多標籤。我該怎麼做才能讓htmlspecialchars在過濾其他標籤時忽略一些標籤。
我目前正在開發一個應用程序,要求用戶提交在網站上顯示的帖子和評論。因爲我們都知道用戶輸入不可信,所以我使用htmlspecialchars($ string,ENT_QUOTES)來處理用戶的帖子和評論。PHP中的用戶輸入過濾
現在,我想要忽略某些特定的html標記。如<b><br />
和更多標籤。我該怎麼做才能讓htmlspecialchars在過濾其他標籤時忽略一些標籤。
溶液)
使用用strip_tags insted的用htmlspecialchars,並列入白名單所需的標籤。
更好的解決方案B)
使用bbcodes,並給別名到想要的標籤,e.g:[B]大膽[/ B]
我會大力推薦你使用Zend_Filter來通過用戶輸入進行過濾。具體而言,請參閱: http://framework.zend.com/manual/en/zend.filter.html#zend.filter.introduction.using
Zend_Filter_StripTags的一個例子是http://stackoverflow.com/questions/1069805/use-of-zend-framework-settagsallowed-gettagsallowed/1070052#1070052 – 2009-07-01 16:38:37
,可隨時更換引號的字符串重新插入允許的標籤。對於<b>
標籤例如:
$string = str_replace(array('<b>', </>), array('<b>', '</b>'), $string);
我將只允許非常明顯的,完整的標籤是儘可能安全。即如果你不需要使用正則表達式,它可能導致非常討厭的錯誤。
它是非常非常困難只允許一些HTML標籤,而不允許任何腳本注入或類似的可能性。
我實際上建議避免這種情況,並使用生成HTML的東西,如this UBB code parser(或類似)。甚至Markdown(關閉HTML選項)。
這不會給攻擊者造成攻擊你網站的空間,如果它是面向公衆的,這是非常重要的。
如果您甚至允許通過一些HTML,那麼確定的攻擊者可能會找到一個方法。
由於目前的缺陷或不安全的HTML過濾器的使用情況,厭倦了使用BBCode?- > HTML Purifier
HTML淨化器是一個用PHP編寫的符合標準的HTML過濾器庫。 HTML淨化器不僅會刪除所有惡意代碼(更好地稱爲XSS)與一個經過充分審計,安全但寬鬆的白名單,...
瞭解到這個昨天和整個安全噩夢領域得到解決。 – 2010-05-03 20:04:34
這不像您可能的事那麼簡單,因爲htmlspecialchars()
和htmlentities()
都不提供任何選項忽略某些標籤(兩種功能甚至不知道標籤的概念的含義)。
您可以使用其他方式讓用戶格式化他們的帖子,例如, BBCode,Textile或Markdown。有PHP解析器可用於所有這些解析器。
如果您必須堅持使用html標籤,您可以採取一些預處理,重新格式化允許的標籤,以便它們不會受到htmlspecialchars()
的影響。然後,您可以對結果進行後處理,將格式更改回普通的HTML標籤。以下示例將該過程可視化爲一個簡單的<a>
標籤。請注意,使用正則表達式處理HTML很容易出錯,並不總是如此 - 我只是爲了簡單起見才使用它。
$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);
這是未經測試的,肯定需要更多的工作。
如...?似乎SO不想顯示這些標籤,) – erenon 2009-06-23 10:29:56