HOME»情報処理安全確保支援士掲示板»平成25年度秋、問1の図1について
投稿する
»[0576] 試験勉強のスケジュールについて 投稿数:5
»[0575] 令和3年春試験へのリベンジに向けて切り替えるスレ 投稿数:19
平成25年度秋、問1の図1について [0578]
XSSを極めたい人さん(No.1)
■図1の18行目から20行目のダブルクォーテーションの記載意図について
「"」の記載意図について、下記2点の認識なのですが、
「"」の記載意図が分からない箇所があり、質問させていただきます。
【「"」の記載意図(自分の理解)】
1. print、printlnの内部では、「(」の直後、「)」の直前で必ずダブルクォーテーションでくくる必要がある。
2. ダブルクォーテーション自体を出力する場合は「\"」と書く。
【質問内容】
お手数ですが、図1の18行目から20行目について、
それぞれダブルクォーテーションがどのような意図で記載されているか、
ご教示いただけますと幸いです。
・18行目
out.print("<a href=\"" + escapeHTML(rqUrl) + "\">");
→「\""」の末尾の「"」、「"\"」の先頭の「"」が必要な理由が知りたいです。
・19行目
out.print("【" + escapeHTML(rqLoc) + "】");
→「【"」の末尾の「"」、「"】」の先頭の「"」が必要な理由が知りたいです。
・20行目
out.println(escapeHTML(rqName) + "</a>");
→ほかの行と異なり、「println(」の直後に「"」がついていない理由が知りたいです。
「"」の記載意図について、下記2点の認識なのですが、
「"」の記載意図が分からない箇所があり、質問させていただきます。
【「"」の記載意図(自分の理解)】
1. print、printlnの内部では、「(」の直後、「)」の直前で必ずダブルクォーテーションでくくる必要がある。
2. ダブルクォーテーション自体を出力する場合は「\"」と書く。
【質問内容】
お手数ですが、図1の18行目から20行目について、
それぞれダブルクォーテーションがどのような意図で記載されているか、
ご教示いただけますと幸いです。
・18行目
out.print("<a href=\"" + escapeHTML(rqUrl) + "\">");
→「\""」の末尾の「"」、「"\"」の先頭の「"」が必要な理由が知りたいです。
・19行目
out.print("【" + escapeHTML(rqLoc) + "】");
→「【"」の末尾の「"」、「"】」の先頭の「"」が必要な理由が知りたいです。
・20行目
out.println(escapeHTML(rqName) + "</a>");
→ほかの行と異なり、「println(」の直後に「"」がついていない理由が知りたいです。
2021.01.03 10:05
gumiさん(No.2)
この投稿は投稿者により削除されました。(2021.01.03 13:36)
2021.01.03 13:36
gumiさん(No.3)
まず質問内容3つ全てに言える事ですが、それらは全て文字列の結合処理を行っています。
少しわかりやすくすると以下のような形です。
out.print("A" + "B" + "C")
この場合、「ABC」という結果が出力されます。
「+」演算子は普段は数字の足し算に使われますが、文字列の場合はこのように結合処理を意味する演算子として使用されます
次に「\"」についてですが、これはエスケープシーケンスと言われる処理です。
これは2で書かれている理解で合っています。
先ほどの例でいくと
out.print("A\"" + "B" + "\"C")
この場合、「A"」「B」「"C」をくっつけて出力するので「A"B"C」という結果が出力されます。
つまり18行目は
「"<a href=\"" 」「escapeHTML(rqUrl)」「 "\">"」の三つのブロックが結合された結果が出力されます。
ここでもしかしたら「escapeHTML(rqUrl)」にはなぜダブルクォーテーションが付いてないんだろう?という疑問が生じるかもしれませんが、これは文字列そのものではなく、文字列を出力する関数(メソッド)です。
他言語でも大体そうですが、結合処理の場合は、ダブルクォーテーションで囲まれた文字列そのもの同士だけでなく、文字列の入った変数や文字列を出力する関数とも結合処理を行う事ができ、それらを用いる場合はダブルクォーテーションをつけません。(つけてしまうと、文字列そのものとして解釈されてしまうため)
19行目、20行目は18行目が理解できれば説明は不要かと思いますので、割愛させていただきます。
少しわかりやすくすると以下のような形です。
out.print("A" + "B" + "C")
この場合、「ABC」という結果が出力されます。
「+」演算子は普段は数字の足し算に使われますが、文字列の場合はこのように結合処理を意味する演算子として使用されます
次に「\"」についてですが、これはエスケープシーケンスと言われる処理です。
これは2で書かれている理解で合っています。
先ほどの例でいくと
out.print("A\"" + "B" + "\"C")
この場合、「A"」「B」「"C」をくっつけて出力するので「A"B"C」という結果が出力されます。
つまり18行目は
「"<a href=\"" 」「escapeHTML(rqUrl)」「 "\">"」の三つのブロックが結合された結果が出力されます。
ここでもしかしたら「escapeHTML(rqUrl)」にはなぜダブルクォーテーションが付いてないんだろう?という疑問が生じるかもしれませんが、これは文字列そのものではなく、文字列を出力する関数(メソッド)です。
他言語でも大体そうですが、結合処理の場合は、ダブルクォーテーションで囲まれた文字列そのもの同士だけでなく、文字列の入った変数や文字列を出力する関数とも結合処理を行う事ができ、それらを用いる場合はダブルクォーテーションをつけません。(つけてしまうと、文字列そのものとして解釈されてしまうため)
19行目、20行目は18行目が理解できれば説明は不要かと思いますので、割愛させていただきます。
2021.01.03 13:42
XSSを極めたい人さん(No.4)
gumiさま
丁寧にご教示いただき、ありがとうございます。
メタキャラクタを文字列として出力するためのエスケープシーケンスについては理解していたのですが、仰る通り、 「escapeHTML(rqUrl)」にはなぜダブルクォーテーションが付いてないんだろう?という疑問に感じてました。
変数や文字列出力用関数では「""」がつかない旨、理解しました。
出力内容について、下記の通り理解しました。
・18行目
out.print("<a href=\"" + escapeHTML(rqUrl) + "\">");
→<a href="hoge">が出力される。※hoge=escapeHTML(rqUrl)の返す文字列
・19行目
out.print("【" + escapeHTML(rqLoc) + "】");
→【hoge】が出力される。※hoge=escapeHTML(rqLoc)の返す文字列
・20行目
out.println(escapeHTML(rqName) + "</a>");
→hoge</a>が出力される。※hoge=escapeHTML(rqName)の返す文字列
丁寧にご教示いただき、ありがとうございます。
メタキャラクタを文字列として出力するためのエスケープシーケンスについては理解していたのですが、仰る通り、 「escapeHTML(rqUrl)」にはなぜダブルクォーテーションが付いてないんだろう?という疑問に感じてました。
変数や文字列出力用関数では「""」がつかない旨、理解しました。
出力内容について、下記の通り理解しました。
・18行目
out.print("<a href=\"" + escapeHTML(rqUrl) + "\">");
→<a href="hoge">が出力される。※hoge=escapeHTML(rqUrl)の返す文字列
・19行目
out.print("【" + escapeHTML(rqLoc) + "】");
→【hoge】が出力される。※hoge=escapeHTML(rqLoc)の返す文字列
・20行目
out.println(escapeHTML(rqName) + "</a>");
→hoge</a>が出力される。※hoge=escapeHTML(rqName)の返す文字列
2021.01.04 17:05
その他のスレッド
»[0577] 平成29年春午後2問2 投稿数:4»[0576] 試験勉強のスケジュールについて 投稿数:5
»[0575] 令和3年春試験へのリベンジに向けて切り替えるスレ 投稿数:19