文字コードとHTMLエンコードとCross-Site Scriptingの微妙な関係の考察

ちょっと古いけど、
2006-03-27
2006-03-28
ここら辺の問題を、Servlet(Tomcat5.5)を使っていろいろ試してみました。

public class BreakQuote extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
//        request.setCharacterEncoding("Shift-JIS");
//        response.setCharacterEncoding("Shift-JIS");
//        response.setContentType("text/html; charset=Shift_JIS");
        String id = request.getParameter("id");
        PrintWriter out = response.getWriter();        
        out.println("<html><body>");
        out.println("<form method=\"POST\">");
        out.println("<input type=\"text\" name=\"id\" value=\"" + id + "\">");
        out.println("<input type=\"submit\" />");
        out.println("</form>");
        out.println("</body></html>");
    }
}

こんな感じでコードを書くと動きます。直感的には、Javaだと動かないんじゃね?って思ってたんですが、文字コード変換のメソッドを通過していない場合は動くみたいです。逆にコメントアウトしてあるコードのどれかを通過すると動きません。jspでは暗黙的にresponse.setContentType()が呼び出されるので動かないみたいです。
Accept-Language=ja 向けのシステムでは文字コード周りをしっかり設定しないと使い物になりませんが、Accept-Language=en 向けのシステムはそういう訳でもないため、注意が必要かもしれません。