セキュリティスペシャリスト
問題はIPAからご確認ください。
https://www.ipa.go.jp/shiken/mondai-kaiotu/2021r03.html#aki_sc
答えはIPAの回答例となります。
概要

設問1
(1)
問題 表1中の「a」に入れる適切な行番号を、図1中から選び、答えよ。

[a]の指摘事項はファイルアクセス用にパスを作成している箇所となります。
表1を確認すると、13行名のコードがパスを作成しています。
13:File fileObj = new File(PDF_DIRECTORY + “/” + clientCode + “/” + “DeliverySlip” + inOrderNo + “.pdf”);
PDF_DIRECTORY=2行名で定義してる「/var/pdf」
clientCode =12行名で得意先コードを取得してます
inOrderNo=3行目で取得した注文番号ですので
パスとしてはこんな感じのものが作成されます
例:/var/pdf/A-sya/DeliverySlip001.pdf
答え a:13
(2)
問題 表1中の「b」に入れる適切な行番号を、図1中から選び、答えよ。

bはリソースを開放してないところの指摘となり、
stmtとStatement
ResultSet
resultObj ともう一つが指摘箇所となります。
後は、14行目の BufferedInputStream in となります。
stmt:DB接続で作られるオブジェクトで使い終わったら Statement
stmt.close()
ResultSet
resultObj :SQLの結果セットして、使い終わったら resultObj.close()
BufferedInputStream in:ファイルを読むストリームで、使い終わったら in.close()
答え b:in
(3)
問題 図2中の「c」、「d」に入れる適切な字句を答えよ

現在のcは
sql = sql + ” WHERE head.order_no = ‘” + inOrderNo + “‘ “;
となっていて、ユーザが入力した inOrderNo = 注文番号 が合った場合にその注文番号の情報を返していますが、
悪意のあるユーザがinOrderNo の入力値を「OR ‘1’=’1’」と入力してきたら
sql = sql + ” WHERE head.order_no = ‘” + OR ‘1’=’1′ + “‘ “;
となり、1=1 は
常に真(true)なので、すべてのレコードを抽出できてしまう可能性があります。
なので、プレースホルダー「?
」を使います。
sql = sql + ” WHERE head.order_no = ?
とすることで「?
」にOR ‘1’=’1’が代入され、データベースは、この「OR ‘1’=’1」をSQLコマンドの一部ではなく、単なる文字列として扱い注文番号を探します。
答え c:WHERE head.order_no = ?
dはStatement stmt = conn.createStatement();の所になります。
上記でプレースホルダ「?」を使用しました。
プレースホルダ「?」は、あとでこの「?」に文字列が来るからよろしくって合図となります。
しかしStatementでは、「?」は単なる文字として扱うので、
sql = sql + “WHERE head.order_no = ?;
Statement stmt = conn.createStatement();
ResultSet resultObj = stmt.executeQuery(sql);
これだと【WHERE head.order_no = ?】 を?って文字をDBから探し出す形なります。
そのため、「?」=後から値が来る目印 として扱うために、PreparedStatementを使用します。
※prepareStatement()は、引数として準備したいSQL文を渡す必要があるので注意
答え d:PreparedStatement stmt = conn.prepareStatement(sql)
設問2(1)

問題 本文中の「e」に入れる適切な変数名を、図5中から選び、答えよ
(修正で図4中からとなります)

不具合があり、不具合の内容は自分のIDでログインして注文番号を入力すると、別の得意先の注文情報が表示されるとのことです。
不具合を踏まえて、図4を確認すると、問題のありそうなコードは
2行名の「private static String orderNo;」があります。static
変数は、クラスのオブジェクトごとではなく、クラス全体で1つだけ共有される特別な変数です。
ウェブアプリは、複数のユーザーからのリクエストを同時に処理します。
なので例えば、
ユーザーAが、setOrderNo メソッドを呼び出し orderNo 変数に、ユーザーAの注文番号:11111をセットする。
ユーザーBが直ぐ後に、setOrderNo メソッドを呼び出し注文番号:22222をセットし、orderNo 変数に上書きする。
ユーザーAが次に進み、getOrderInfoBean メソッドを呼び出す。
orderNo には注文番号:22222が入っているので、ユーザーAは自分の注文情報:11111ではなく、ユーザーBの注文情報:22222を受け取ってしまいます。
答え e:orderNo
(2)
問題 本文中の「e」に入れる適切な字句を、英字10字以内で答えよ
(1)の通り、orderNoを宣言しているので、答えは
答え f:static
(3)

問題 本文中の下線①の不具合は何と呼ばれているか。15字以内で答えよ。
今回の不具合のような複数のプロセスが共有リソースに同時にアクセスし、その処理のタイミングによって結果が変わってしまう状態のことを「レースコンディション」(競合状態)と呼ばれます。
答え:レースコンディション
(4)

問題 図6中の「g」、図7中の「h」、「i」に入れる適切な字句を答えよ
図4の2~5行目を削除しているので、orderNo変数とsetOrderNoメソッドが削除されました。
なので、getOrderInfoBeanに引数である注文番号を渡してあげる必要があります
答え g:String OrderNo
static
メソッドは、クラス名を直接使って呼び出すことができるのですが、不具合解消の為、getOrderInfoBean
から static
を外しました。なのでクラスをインスタンス化する必要があります。
答え h:new
getOrderInfoBean
メソッドから static
を外したので
OrderInfoBL.getOrderInfoBean();
は使えなくなりました。getOrderInfoBean
メソッドを呼び出すには、取得した orderNo
変数を引数として渡す必要があります。
答え i:getOrderInfoBean(orderNo)
(5)
問題 本文中の「j」に入れる適切な属性名を、図3中から選び、答えよ


問題4ページにログインした利用者IDと、利用者IDにひも付く得意先コード及び得意先名はセッションオブジェクトに保存されているとあります。
注文ヘッダーテーブルには得意先コードがあるので、
答え j:得意先コード
コメント