弊社の新人エンジニア研修向けのJSP Servletの問題集です。

1.クロスサイトスクリプティング対策

あなたはお仕事で以下の掲示板のプロトタイプを作成した。

<ソースコード①>  bbs.jsp

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>健全な青年男女の交流掲示板</title>

        <%!
            List<String> names = new ArrayList<String>();
            List<String> comments = new ArrayList<String>();
            //ここにXSSを無効化するメソッドを宣言する
        %>
    </head>
    <body>
        <h1>健全な青年男女の交流掲示板 プロトタイプ</h1>

        <form action="#" method="post">
            <p>お名前をどうぞ:<input type="text" name="name"></p>
            <p>コメントをどうぞ:<textarea name="comment"></textarea></p>
            <input type="submit" value="書き込み">
            <input type="reset" value="リセット">
        </form>

        <%

            String name = request.getParameter("name");
            String comment = request.getParameter("comment");

            if (!(name == null || comment == null)) {
                names.add(name);
                comments.add(comment);

                for (int i = 0; i < names.size(); i++) {
                    out.print(names.get(i));
                    out.print("<br>");
                    out.print(comments.get(i));
                    out.print("<br>");
                    out.print("--------------------------");
                    out.print("<br>");
                }
            }
        %>
    </body>
</html>

 

職場の先輩Y氏に見せたところ以下の指摘を受けた。

「このままではクロスサイトスクリプティングの脆弱性があるね。Javaスクリプトのコードを入れられてしまうよ。」

例えば、テキストエリアに以下のコードを書き込んでみることを促された。

<script>
      alert('いけない情報');
</script>

 

問:上記ソースコードの宣言①のところにXSSを無効化するメソッドを宣言して、スクリプトレットの中で使用しなさい。

 

2.ディレクトリトラバーサル対策

あなたはお仕事で以下の情報検索システムのプロトタイプを作成した。

職場の先輩Y氏に見せたところ以下の指摘を受けた。

「このままではディレクトリトラバーサルの脆弱性があるね。他のディレクトリにアクセスされる可能性があるよ。」

セキュリティホールを塞ぎなさい。

<ソースコード①> index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>個人情報 検索画面</title>
    </head>
    <body>
        <form action="../DirectoryTraversal" method="post">
            ローマ字でお名前を入れてください。(例:imai)<br>
            <br>
            お名前 <input type="text" name="name"><br>
            <input type="submit" value="送信">
            <input type="reset" value="取消">
        </form><br>
        <p>例えばここで「secret/index」と入力するとどうなるか?</p>
    </body>
</html>

<ソースコード②> DirectoryTraversalServlet.java

package p19;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/DirectoryTraversal")
public class DirectoryTraversalServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        out.println("Hello");

        response.setContentType("text/html; charset=UTF-8");

        String str = request.getParameter("name");
        System.out.println("/folder/" + str + ".jsp");
        getServletContext().getRequestDispatcher("/folder/" + str + ".jsp")
                .forward(request, response);

    }
}

<ソースコード③>imai.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>今井</title>
    </head>
    <body>
        今井です。実は劇団員をしています。
    </body>
</html>

<ソースコード④>yamazaki.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>山崎</title>
    </head>
    <body>
        山崎です。こう見えて実はレタスを育てています。
    </body>
</html>

<ソースコード⑤>secret/index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Top Secret</title>
    </head>
    <body>
        トップシークレットな情報です。
    </body>
</html>

 

3.SQLインジェクション対策

あなたは、以下のような社員給与台帳システムのプロトタイプを作成した。

 

職場の先輩Y氏に見せたところ以下の指摘を受けた。

「SQLインジェクション攻撃を受ける可能性がるね。全社員の給与情報が見れてしまうよ。」

①なぜ、このままではいけないのかを“攻撃入力”の場合のSQL文を手書きしたうえで説明しなさい。

②プレースホルダを使いセキュリティホールを塞ぎなさい。

 

<データベースのテーブル構造>

 

 

 

 

 

 

 

 

<ソースコード① index.jsp>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <form action="SQLISampleServlet" method="get">
            <p>Noを入力:<input type="text" name="no"></p>
            <input type="submit" value="送信">
        </form>
        <p>正常入力:1 と入力してみること</p>
        <p>攻撃入力:xxxxと入力してみること</p>
    </body>
</html>

<ソースコード②> は講師から受け取ること。

※WAFのブラックリストに引っかかってここには掲載できないため。

 

4.オリジナル問題作成

 

将来の後輩のために良い問題が出来たら教えてください。
 

 

JavaWebアプリケーションの問題集に戻る