javaでHTMLタグをサニタイジングしてみる

java

XSSなどの攻撃を防ぐ方法として、HTMLタグの無害化(サニタイジング)があります。

javaのサニタイジング事情ですが、最近のjavaフレームワークでは、サニタイジングを自動でしてくれるものもあります。
フレームワークで制御されていたら、ついつい自分で考えることがなくなります。
今回は自前でサニタイジングする方法を紹介します。

[スポンサーリンク]

この章でやること

自前でサニタイジングする方法を紹介します。
apache-commonsライブラリを使ったサニタイジング方法を紹介します。

サニタイジングとは(サニタイジングの基礎知識)

javaのサニタイジングを紹介する前に、サニタイジングの基本をおさらいします。
そのそもサニタイジングとは、コードの無害化です。

以下のように、HTMLタグを無害化することをサニタイジングと呼びます。
なぜ無害化する必要があるのか?については割愛します。(googleで検索したらたくさんでてきます。)

("&" , "&" )
("<" , "&lt;"  )
(">" , "&gt;"  )
("\"", "&quot;")
("'" , "&#39;" )

自前でサニタイジングする方法

replaceAllの順番を変えたら、結果がおかしくなります。注意して下さい。

    /**
     * タグを無害化します。
     * @param str
     * @return
     */
    private static String convertSanitize( String str ) {
        if(str==null) {
            return str;
        }
        str = str.replaceAll("&" , "&amp;" );
        str = str.replaceAll("<" , "&lt;"  );
        str = str.replaceAll(">" , "&gt;"  );
        str = str.replaceAll("\"", "&quot;");
        str = str.replaceAll("'" , "&#39;" );
        return str;
     }

    /**
     * 無害化されたタグを元に戻します
     * @param str
     * @return
     */
    private static String convertUnsanitize( String str ) {
        if(str==null) {
            return str;
        }
        str = str.replaceAll("&#39;" , "'" );
        str = str.replaceAll("&quot;", "\"");
        str = str.replaceAll("&gt;"  , ">" );
        str = str.replaceAll("&lt;"  , "<" );
        str = str.replaceAll("&amp;" , "&" );
        return str;
     }
&#91;/java&#93;

<div class='br3'></div>
<h3>apache-commonsライブラリを使ったサニタイジング方法</h3>
mavenを使用している場合はこちらを<strong>pom.xml</strong>に追加して下さい。
[xml num='1' toolbar='false' ruler='true' highlight_lines='']
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.3</version>
    </dependency>
[/xml]

<div class='br2'></div>
apache-commonsライブラリを使ったソースはこちらです。
[java num='1' toolbar='false' ruler='true' highlight_lines='']
    /**
     * サニタイジングします
     * @param args
     */
    public static void main( String[] args )
    {
        // タグを無害化します。
        System.out.println(StringEscapeUtils.escapeHtml("<>\"'&"));

        // 無害化されたタグを元に戻します
        System.out.println(StringEscapeUtils.unescapeHtml("&lt;&gt;&quot;&#39;&amp;"));
    }

最後に

冒頭でも少し触れましたが、サニタイジングをフレームワークまかせにすると、ついつい忘れてしまいます。。
サニタイジングは、Webアプリの基本です。しっかりおさえておきましょう!
それでは!