弊社の新人エンジニア研修向けのJSP Servletの問題集です。
1.クロスサイトスクリプティング対策
あなたはお仕事で以下の掲示板のプロトタイプを作成した。
<ソースコード①>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<%@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> |
ところが先輩によればこのままではクロスサイトスクリプティングの脆弱性があるとの指摘を受けた。
例えば、テキストエリアに以下のコードを書き込んでみることを促された。
1 2 3 |
<script> alert('いけない情報'); </script> |
問:①のところにXSSを無効化するメソッドを宣言して、スクリプトレットの中で使用しなさい。
2.ディレクトリトラバーサル対策
あなたはお仕事で以下の情報検索システムのプロトタイプを作成した。
しかし、先輩からディレクトリトラバーサルの脆弱性を指摘された。
セキュリティホールを塞ぎなさい。
<ソースコード①> index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>個人情報 検索画面</title> </head> <body> <form action="DirectoryTraversalServlet" method="get"> ローマ字でお名前を入れてください。(例:imai)<br> <br> お名前 <input type="text" name="name"><br> <input type="submit" value="送信"> <input type="reset" value="取消"> </form><br> <p>例えばここで ../secret/secret と入力するとどうなるか?</p> </body> </html> |
<ソースコード②> DirectoryTraversalServlet.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class DirectoryTraversalServlet */ @WebServlet("/DirectoryTraversalServlet") public class DirectoryTraversalServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String str = request.getParameter("name"); System.out.println("/folder/" + str + ".html"); getServletContext().getRequestDispatcher("/folder/" + str + ".html") .forward(request, response); } } |
<ソースコード③>imai.html
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>今井</title> </head> <body> 今井です。実は劇団員をしています。 </body> </html> |
<ソースコード④>yamazaki.html
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>山崎</title> </head> <body> 山崎です。こう見えて実はレタスを育てています。 </body> </html> |
<ソースコード⑤>secret.html
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Top Secret</title> </head> <body> トップシークレットな情報です。 </body> </html> |
3.SQLインジェクション対策
あなたは、以下のような社員給与台帳システムのプロトタイプを作成した。
ところが、先輩社員からこのままではSQLインジェクション攻撃を受ける可能性があることを指摘された。
①なぜ、このままではいけないのかを“攻撃入力”の場合のSQL文を手書きしたうえで説明しなさい。
②プレースホルダを使いセキュリティホールを塞ぎなさい。
<データベースのテーブル構造>
<ソースコード① index.jsp>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<%@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.オリジナル問題作成
将来の後輩のために良い問題が出来たら教えてください。