2009年12月20日

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


更多精選推薦文章

0 意見 :