HTML Purifier – 另類的 PHP input validation

對 web programming 的人來說,XSS 很早以前就不是新聞,而且不管是為了 XSS、SQL injection 或是其他理由,任何 user input 都不應該被信任,在使用以前就應該先被 validate 或是 filter 過。

但是問題來了,一般的 filter 都很好解,有許多現成的工具,甚至大不了就用駝鳥法把 html 的特殊字元 escape 掉。但是對於需要依賴使用者輸入 html 的東西怎麼辦?最明顯的例子就是 blog site。Blog 站台總不能不讓使用者輸入 HTML 吧?甚至插插圖、秀秀跑馬燈、放個 YouTube video 之類的,應該也都是稀鬆平常的事情。但是要達到這種效果,該怎麼做呢?

比較明顯的有幾個解法:

  1. 鴕鳥法,XSS 管他去死。(別懷疑,真的有人這樣子) 網站安全度不重要,先讓使用者爽再說。
  2. 使用不同 domain 來避免 XSS 問題。例如 Blogger 的操作是在 blogger.com,但是 blog 是出現在 blogspot.com。
  3. 使用自己的 html 過濾器,重新濾一次使用者輸入的 html。安全又可以不用換 domain,缺點就是使用者一定會有些想用的 tag 被濾掉而感覺到不便。

對於像是 GYM 規模的公司來說,一定會有自己的 html input filter 工具。可是對於外界的 user 來講就不那麼方便了。現成 open source 領域中,大部分的 filter 大多未經考驗,或是功能太弱。

不過情況似乎有了些改變。現在 Edward Yang 寫了一套 HTML purifier,使用 LGPL license 釋出。看起來彈性空間很大,filter 的效果也很好。有興趣的可以看 HTML purifier 對目前常見的 XSS 過濾效果,或是它的 docs 了解一些 tune 的方式。唯一的缺點是 – 目前只有 PHP 版,而且想當然耳,要 parse 清楚這麼複雜的 HTML 當然程式碼又大又肥 …。不過即使如此,這大概還是 Open Source 界堪用最好的 HTML filter 了吧。

看完 HTML Purifier,我的感想跟 Joseph Halter 一樣….

You save my day by allowing me not to write another damned HTML parser.

留言