Cross Site Scripting

Cross Site Scriptingとは、以下のようにパラメータにScriptタグなどのブラウザで実行可能なスクリプトを挿入して、 不正な操作を実行することを指します。

Cross Site Scripting

問題

まずは不正操作が実行できることを試してみましょう。
作業登録画面で以下のようなコードを入力してみてください。

<Script>alert("Script")</Script>

この作業を登録すると、以降一覧画面を表示するたびに以下のようなダイアログが表示されてしまいます。

Scriptダイアログ

作業項目名として常にHTMLタグが出力されてしまうためにこのような現象が発生してしまいます。

回避方法

この問題を回避するためには、 HTMLとして出力されることになるパラメータが不正なものでないかをチェックする必要があります。

例えば、以下のように作業項目名にHTML上意味がある文字を、HTMLとして解釈されない文字(表示はされる)に置換することで、 このような問題の発生を防ぐことができます。

/**
     * 登録要求を処理します。
     * 
     * @param req
     * @param resp
     * @return
     * @throws ServletException
     * @throws IOException
     */
    private String doAddAction(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        try {
...
            name = toSafeName(new String(name.getBytes("iso-8859-1"), "Shift_JIS"));
...

    /**
     * 編集要求を処理します。
     * 
     * @param req
     * @param resp
     * @return
     * @throws ServletException
     * @throws IOException
     */
    private String doEditAction(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        try {
...
            name = toSafeName(new String(name.getBytes("iso-8859-1"), "utf-8"));
...
    
    /**
     * 安全なHTML文字列に変換します。
     * @param str
     * @return
     */
    private String toSafeName(String str) {
        str = str.replaceAll("&", "&amp;");
        str = str.replaceAll("<", "&lt;");
        str = str.replaceAll(">", "&gt;");
        str = str.replaceAll("'", "&#39;");
        str = str.replaceAll("\"", "&quot;");

        return str;
    }