質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

XSS

XSS【クロスサイトスクリプティング】は、 ソフトウェアのセキュリティホールの一つで、Webサイトに脆弱性が あることからその脆弱性を利用し攻撃する手法です。 主に、入力フォームなどから悪意あるスクリプトを挿入し 該当ページを閲覧したブラウザ上でそのスクリプトを実行します。

Q&A

解決済

1回答

3667閲覧

JavaでXSS対策ができません。

Marina_

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

XSS

XSS【クロスサイトスクリプティング】は、 ソフトウェアのセキュリティホールの一つで、Webサイトに脆弱性が あることからその脆弱性を利用し攻撃する手法です。 主に、入力フォームなどから悪意あるスクリプトを挿入し 該当ページを閲覧したブラウザ上でそのスクリプトを実行します。

0グッド

2クリップ

投稿2021/08/17 02:19

編集2021/08/17 04:22

■ 実現したいこと
・毎日の反省を記録し、一覧表示させる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("&", "&amp;"); 90 // 「<」を変換 91 charAfterEscape = inputText.replace("<", "&lt;"); 92 // 「>」を変換 93 charAfterEscape = inputText.replace(">", "&gt;"); 94 // 「"」を変換 95 charAfterEscape = inputText.replace("\"", "&quot;"); 96 // 「'」を変換 97 charAfterEscape = inputText.replace("'", "&#039;"); 98 99 return charAfterEscape; 100 } 101}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_3578

2021/08/17 02:28

とりあえずぐちゃぐちゃになってるソースコードを整えるところから始めましょう。
Marina_

2021/08/17 02:44

ご指摘いただき、ありがとうございます。 大変失礼いたしました。修正いたしました。
jimbe

2021/08/17 03:57

``` ~ ```の中にソースコードがちゃんと入っていないようですが…。 また、 txt では無く言語名をお書きください。
Marina_

2021/08/17 04:24

jimbeさん ご指摘いただき、ありがとうございます。 直前もtxtコードになっていたため、javaでコードを囲んでもコードとして認識されなかったようです。 txtで囲った後、通常の文章を書き、その後にjavaで囲ったところ、コードとして認識されるようになりました。 今後間違えることがなくなりそうです。 助かりました。ありがとうございました。
guest

回答1

0

ベストアンサー

replaceEscapeCharの中身ですが、inputText.replaceの上書きを続ける形になっているので、結局は最後のcharAfterEscape = inputText.replace("'", "&#039;");だけ実行したのと同じ結果になっています。

投稿2021/08/17 02:24

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marina_

2021/08/17 02:40

maisumakunさん ご教授いただき、誠にありがとうございます。 下記URLのescapeメソッドを使用し、解決しました。 http://www.code-magagine.com/?p=577 メソッドが正しいかを疑うべきでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問