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;
     }

apache-commonsライブラリを使ったサニタイジング方法

mavenを使用している場合はこちらをpom.xmlに追加して下さい。

    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.3</version>
    </dependency>

apache-commonsライブラリを使ったソースはこちらです。ただしタグだけじゃなくて2byte文字もサニタイズされるので気をつけて下さい。

    /**
     * サニタイジングします
     * @param args
     */
    public static void main( String[] args )
    {
        // タグを無害化します。
        System.out.println(StringEscapeUtils.escapeHtml("<>\"'&"));

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

最後に

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