HTML Purifier in Java:HTMLInputFilter

在製作 web services 的時候,我們常需要防範不當使用者的惡意攻擊,
而在這些攻擊之中,最著名的就是XSS (Cross Site Scripting),
其運作方式和常用的攻擊手法可見下列連結:
而在眾多的 web services 程式語法中,以 PHP 對 xss 攻擊的防範最完全,
因為 PHP 有個套件名為 HTML Purifier ,如官網的小標題,這個套件的目的是:
Standards-Compliant HTML Filtering ,也就是除了過濾也還有將語法標準化的功能。
HTML Purifier 經由多方的努力已有成效,他可抵擋的攻擊可見 xssAttacks

然而針對其他程式語言的使用者,看著 PHP 套件如此強大卻沒辦法使用,
在網路上詢問也只能得到像這個網站的解答:HTML Purifier in Java
這篇的結論是在 Java 中使用 Resin Quercus (a PHP interpreter for the JVM) ,
但實際上也沒有人測過到底會不會 work.... ,而且這種繞了大彎的方法真的很麻煩,
於是我後來找到的解法是:HTMLInputFilter,雖然功能可能沒有 HTML Purifier 強,
但至少基本的功能都有了,也算是可行的解決之道。

以下就是 HTMLInputFilter 的使用範例:
  1. import java.util.ArrayList;
  2. import com.josephoconnell.html.HTMLInputFilter;

  3. /**
  4. * 使用 HTMLInputFilter 達成過濾 xss 等惡意字串攻擊的範例
  5. *
  6. * @author werdna at http://werdna1222coldcodes.blogspot.com/
  7. */

  8. public class HTMLInputFilterDemo {

  9. public static void main(String[] args) {

  10. // For use of HTMLInputFilter, go to the followed website first.
  11. // http://josephoconnell.com/java/xss-html-filter/

  12. // 設定要過濾字串的 List
  13. // 常見的 xss 攻擊語法可見:http://htmlpurifier.org/live/smoketests/xssAttacks.php
  14. ArrayList<String> xssList = new ArrayList<String>();
  15. xssList.add("<script>alert(document.cookie)</script>");
  16. xssList.add("<script>alert('XSS')</script>");
  17. xssList.add("<img src=\"javascript:alert('XSS')\"> ");
  18. xssList.add("<BR SIZE=\"&{alert('XSS')}\">");
  19. xssList.add("<LINK REL=\"stylesheet\" HREF=\"javascript:alert('XSS');\">");

  20. // 取得 HTMLInputFilter 物件
  21. HTMLInputFilter htmlInpuFilter = new HTMLInputFilter();
  22. String purifiedHtml;

  23. for (String xss : xssList) {
  24. // 過濾 xss 字串
  25. purifiedHtml = htmlInpuFilter.filter(xss);
  26. System.out.println("原始 xss:" + xss + "\t\t過濾後:" +purifiedHtml);
  27. }
  28. }
  29. }
輸出的結果會像下面,其中4, 5兩行過濾後輸出是空的:
  1. 原始 xss:<script>alert(document.cookie)</script> 過濾後:alert(document.cookie)
  2. 原始 xss:<script>alert('XSS')</script> 過濾後:alert('XSS')
  3. 原始 xss:<img src="javascript:alert('XSS')"> 過濾後:<img src="#alert('XSS')" />
  4. 原始 xss:<BR SIZE="&{alert('XSS')}"> 過濾後:
  5. 原始 xss:<LINK REL="stylesheet" HREF="javascript:alert('XSS');">過濾後:
由以上可知,介由 HTMLInputFilter 的確可過濾 xss 的攻擊,
如果不想浪費時間在 java 中呼叫 php 的功能,HTMLInputFilter 的確是個好選擇。

關鍵字:HTML, Purifier, HTMLInputFilter, xss, filter, purify, cross site scripting
參考資料:
  1. wikipedia:Cross-site scripting
  2. 浅析XSS(Cross Site Script)漏洞原理
  3. XSS (Cross Site Scripting) Cheat Sheet
  4. HTML Purifier
  5. HTML Purifier in Java
  6. HTMLInputFilter

這個網誌中的熱門文章

2018年5月繳106年度綜合所得稅信用卡優惠整理!

最新106年度綜合所得稅計算教學!教你看懂稅率級距表/免稅額/扣除額!今年新增基本生活費不課稅也更新囉~

綜合所得稅節稅攻略:列舉扣除額保險費篇!

證件遺失補辦身分證/健保卡/駕照/行照/信用卡總整理

國泰Koko combo icash網購/超商/icash/繳費5%!

綜合所得稅節稅攻略:列舉扣除額房貸房租篇!

2018最新博客來100,50,25折價券序號e-coupon分享

7-11/全家/萊爾富刷信用卡/icash繳費賺回饋攻略!

繳納2018/107年度房屋稅信用卡回饋/分期整理!

繳納2018/107年度牌照稅信用卡回饋/分期整理!