■ 実現したいこと
・毎日の反省を記録し、一覧表示させるwebアプリを作っています。
・XSS対策の練習のため、一覧表示するタイミングでXSS対策を施したいです。
・replaceEscapeCharメソッドを作り、出力時に「&」「<」「>」「"」「'」の5つの文字列を変換する方法で行いたいです。
■ 行ったこと
・下記処理を施した
・XSSとして、下記をテキストボックスに入力、登録ボタンを押下した。
txt
1<script type="text/javascript">while(true){ alert("まだXSS対策が出来ていません!"); }</script>
・一覧画面表示時にXSSに引っかかってしまい、「XSS!」というアラートのポップアップが出てしまう。
・下記を埋め込んだところ、コンソールにはエスケープ前の文字列が返ってきたため、XSSができていないことがわかりました。
System.out.println(replaceEscapeChar(dto.getInitiative()));
<script type="text/javascript">while(true){ alert("XSS対策がまだ出来ていません!"); }</script>コンソールの結果
■ 原因と考えられること
・すみません。わかりません。
・replaceメソッドの定義や使い方は教材そのままです。
・前にバージョンが変わったことにより、教材のままではある動作が出来ないことがありました。今回は、メソッドを定義しているため、そのような原因ではないと思われます。
java
1 2package work; 3 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.util.ArrayList; 7import java.util.List; 8 9import javax.servlet.ServletException; 10import javax.servlet.http.HttpServlet; 11import javax.servlet.http.HttpServletRequest; 12import javax.servlet.http.HttpServletResponse; 13/**----------------------------------------------------------------------* 14 *■■■ShowAllRecordsクラス■■■ 15 *概要:サーブレット 16 *詳細:「reflection」テーブルのデータを全件抽出して記録一覧画面を出力する。 17 *----------------------------------------------------------------------**/ 18public class ShowAllRecords extends HttpServlet { 19 private static final long serialVersionUID = 1L; 20 21 public ShowAllRecords() { 22 super(); 23 } 24 25 protected void doGet(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 28 //レスポンス(出力データ)の文字コードを設定 29 response.setContentType("text/html;charset=UTF-8"); 30 31 //出力用のストリームの取得 32 PrintWriter out = response.getWriter(); 33 34 //「reflection」テーブルのデータを全件抽出 35 List<RecordsDto> list = new ArrayList<RecordsDto>(); 36// ビジネスロジックをインスタンス化し、セレクトするメソッドを呼び出し、listで受け取る 37 ShowAllRecordsBL logic = new ShowAllRecordsBL(); 38 list = logic.executeSelectRecords(); 39 40 //HTML文書(記録一覧画面)の出力 41 out.println( "<html> "); 42 out.println( " <head> "); 43 out.println( " <title>記録一覧</title> "); 44 out.println( " </head> "); 45 out.println( " <body> "); 46 out.println( " <h2>記録一覧</h2> "); 47 out.println( " <table class=\"surbey_list\" border=1> "); 48 out.println( " <tr bgcolor=\"#c0c0c0\"> "); 49 out.println( " <th>自主的に行ったこと</th> "); 50 out.println( " <th>高い成果を出したこと</th> "); 51 out.println( " <th>改善点(仕事の仕方)</th> "); 52 out.println( " <th>改善点(コミュニケーション)</th> "); 53 out.println( " <th>記録時間</th> "); 54 out.println( " </tr> "); 55 56 for (int i = 0; i < list.size(); i++) { 57 RecordsDto dto = list.get(i); 58 out.println( " </tr> "); 59 out.println( " <td>" + replaceEscapeChar(dto.getInitiative()) + "</td>"); 60 System.out.println(replaceEscapeChar(dto.getInitiative())); 61 62 out.println( " <td>" + replaceEscapeChar(dto.getAccomplishment()) + "</td>"); 63 out.println( " <td>" + replaceEscapeChar(dto.getTo_improve_work()) + "</td>"); 64 out.println( " <td>" + replaceEscapeChar(dto.getTo_improve_commu()) + "</td>"); 65 out.println( " <td>" + dto.getTime() + "</td>" ); 66 out.println( " </tr> "); 67 } 68 out.println( " </table> "); 69 out.println( " <br> "); 70 out.println( " <a href=\"InputRecords\">記録画面に戻る</a> "); 71 out.println( " </body> "); 72 73out.println( "</html> "); 74 75 } 76 77 protected void doPost(HttpServletRequest request, HttpServletResponse response) 78 throws ServletException, IOException { 79 doGet(request, response); 80 } 81 82 //replaceEscapeCharクラス 83 //概要:文字列データのエスケープを行う 84 private String replaceEscapeChar(String inputText) { 85 86 String charAfterEscape = inputText ; //エスケープ後の文字列データ 87 88 // 「&」を変換 89 charAfterEscape = inputText.replace("&", "&"); 90 // 「<」を変換 91 charAfterEscape = inputText.replace("<", "<"); 92 // 「>」を変換 93 charAfterEscape = inputText.replace(">", ">"); 94 // 「"」を変換 95 charAfterEscape = inputText.replace("\"", """); 96 // 「'」を変換 97 charAfterEscape = inputText.replace("'", "'"); 98 99 return charAfterEscape; 100 } 101}
回答1件
あなたの回答
tips
プレビュー