科目B対策へ戻る

注文履歴検索機能のSQLインジェクション修正方針

オリジナル1問1答目安 6分

C社は,日用品の通信販売を行う従業員300名の企業である。C社の会員向けWebサイトには,会員が自分の注文履歴を商品名のキーワードで検索し,注文日又は金額で並べ替えて表示する機能(以下,検索機能という)がある。検索機能は Java で実装されており,データベースには JDBC を用いて接続している。

検索機能の改修に当たり,情報処理安全確保支援士(登録セキスペ)であるDさんがソースコードレビューを行った。図1は,レビュー対象のソースコードの抜粋である。

図1 検索機能のソースコード(抜粋)

// memberId : セッションから取得した会員ID(int型)
// keyword  : リクエストパラメータ q の値(商品名のキーワード)
// sortKey  : リクエストパラメータ sort の値
//            (画面のプルダウンから "order_date" 又は "amount" が送信される)
String sql = "SELECT order_id, item_name, amount, order_date FROM orders"
           + " WHERE member_id = " + memberId
           + " AND item_name LIKE '%" + keyword + "%'"
           + " ORDER BY " + sortKey + " DESC";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);

Dさんのレビュー結果を表1に示す。

表1 レビュー結果(抜粋)

項番指摘内容
1SQL文を文字列連結で組み立てている。keyword に「'」を含む文字列を指定すると,SQL文の構造が変わり,他の会員の注文情報を取得するなどの攻撃が可能である。
2sortKey はプルダウンの値が送信される想定だが,リクエストは利用者が改変できるので,任意の文字列が ORDER BY 句に挿入され得る。
3列名や ORDER BY 句の並べ替えの対象は,SQL文の構造の一部なので,プレースホルダで値として割り当てることができない。

C社の開発チームからは,修正方針として次の案が挙がった。開発チームは,SQLインジェクションを根本的に解消し,かつ,注文日又は金額で並べ替えるという検索機能の要件も満たす修正方針を採用したいと考えている。

設問

本文中の下線の修正方針として,最も適切なものはどれか。解答群のうち,最も適切なものを選べ。

解答群

正解 0 / 解答 0(全1設問)