功能與特性
HTML Purifier可以幫助用戶保障HTML的合法性,它可以使你確認HTML是否包含跨站腳本攻擊企圖或其它的惡意攻擊.通過該軟體你准許用戶粘貼一些HTML內容,卻不會讓其插入惡意代碼,而這種代碼可在查看這些HTML的任何人的瀏覽器中運行.我們可以通過CodeIgniter、 Drupal、 MODx、 Phorum、 Joomla! 、WordPress等來使用該軟體.
HTML Purifier利用一個白名單列表來實現安全,要求一個合法文檔的所有部分都必須明確地獲得准許,而不是象一個黑名單列表那樣查找已知的惡意HTML代碼.冒煙測試(smoke testing)頁明確地列示了有哪些東西被允許,其中還表明了相關的場合.HTML Purifier的一個重要目標是它應當完全理解合法的HTML是什麼樣的,哪些元素可被嵌套在其它元素中,對於一個特定元素的相關HTML屬性來說,哪些是合法的內容.另外,該軟體還包括了對CSS的支持,與其它的HTML驗證工具相比,該軟體有其自身的優越性.
不過,用戶(就是你,呵呵)需要注意,並不存在Ubuntu、Fedora、openSUSE等Linux系統的HTML Purifier軟體包.該軟體可利用pear來安裝,安裝速度很快,這樣我們就可以使用pear的升級來輕易地升級到最新的版本.Pear是的將HTML Purifier包含到用戶的腳本中更加容易了,這是用戶不必在其腳本中指明任何路徑.
安裝與使用
要通過pear安裝HTML Purifier,用戶必須安裝php-pear軟體包,然後利用pear命令安裝HTML Purifier.下面的命令將把HTML Purifier安裝到/usr/share/pear/HTMLPurifier中.
pear channel-discover htmlpurifier.org pear install hp/HTMLPurifier |
對筆者而言,在此階段利用HTML Purifier會導致一個Apache的日誌文件錯誤,即關於Cache.SerializerPath路徑並不存在.該軟體會盡量將下面的目錄用作一個高速緩衝內容的可寫入路徑:/usr/share/pear/HTMLPurifier/DefinitionCache/Serializer.這個高速緩衝存儲器可被關閉,這在INSTALL安裝中有詳細描述,否則你可在/usr中創建目錄,/usr正是 HTML Purifier 要用作一個內容易丟失的緩存的位置.第三種選擇顯示在下面:
# mkdir -p /var/cache/HTMLPurifier # chown apache /var/cache/HTMLPurifier # chmod o-rwx /var/cache/HTMLPurifier # ls -ld /var/cache/HTMLPurifier drwxr-x--- 2 apache root 4096 2008-06-25 14:25 /var/cache/HTMLPurifier |
不幸的是,SerializerPath的默認路徑被編碼後放在了HTMLPurifier/ConfigSchema/schema.ser中,這是一個長度定界的文件,不太容易編輯.最好的方案是使用PHP代碼中的一個配置對象來改變路徑,或採用更好的方法,即用戶的PHP函數,它可以為網站建立配置對象.
下面是一個簡單的index.php文件,它使用了HTML Purifier來清理HTML內容,由同樣的HTML網頁上的一個表單來提交.注意,對htmlspecialchars的調用並不是為了安全性,而僅僅是為了支持由用戶輸入的HTML文本,目的是為了在pre元素內的完全可見.
# cd /var/www/html # mkdir HTMLPurifierTest # chown ben.apache HTMLPurifierTest # chmod s HTMLPurifierTest # su -l ben $ cd /var/www/html $ vi index.php set('Core', 'Encoding', 'ISO-8859-1'); $config->set ('HTML', 'TidyLevel', 'heavy' ); $config->set('Cache', ' SerializerPath', '/var/cache/HTMLPurifier' ); $ purifier = new HTMLPurifier($config); ?> < html> Enter your nastiest HTML below! < /p > < form name="myfrom" action="index.php" > < input type='text' name='query'>< /form> |
如果你希望明確地限制一個用戶可以輸入的HTML元素,可以使用ForbiddenElements配置指令,如下所示.本例將從所輸入的HTML元素中剝離出任何大寫的、斜體或預定格式的標籤.你還可以採用另外一種方法,通過白名單利用AllowedElements明確地指明哪些元素是合法的.
$config->set('HTML', 'ForbiddenElements', 'b,i,pre'); |
HTML Purifier包括了對過濾和管理URI(統一資源標識符)的支持,既可在主要的驗證之前,也可在其後進行.能夠在驗證HTML輸入之前進行過濾准許用戶改變URI.
有一種URI過濾器稱為主機黑名單,它准許你阻止給定的主機名.不過,你一定要小心使用主機黑名單,你的黑名單中的任何東西一旦出現在URL(統一資源定位器)中,它都會被拒絕.幸運的是,主機黑名單類的代碼是很短的,因此你能夠輕易地定義一個類,它只為以特定後綴結尾的URL進行了測試.
小結
大概高速緩存目錄的安裝問題是一個PEAR的限制問題.至少讓HTML Purifier無法正常運行同時又生成冗長的錯誤消息會迫使我們注意在什麼地方存放易丟失的緩存文檔的問題,而不僅僅是簡單地使用/usr下的一個路徑.
HTML Purifier為防止人們輸入錯誤或惡意的HTML代碼起到了保護作用.能夠輸入白名單,又能夠與URI過濾功能結合使用,這就避免了一些用戶輸入非法數據的企圖.URI過濾是一個很好的功能,如果作為管理員的你准許任何人匿名發帖子的話,它可有助於減少論壇的垃圾信息.例如,你可以強化這樣一種策略:在人們匿名發帖子時,他們只能連接到你的網站,如果他們想鏈接到其它的網站,就需要註冊.
總之,HTML Purifier是個實用的工具,你不妨試試.
[火星人 ] 巧用HTML Purifier抵禦惡意代碼已經有607次圍觀