商品検索で、利用者が入力した商品名をSQL文字列へ直接連結している。入力値がSQL命令として解釈されることを防ぐ実装として、最も直接的なものはどれか。検索対象の表名と列名はプログラム内で固定されている。
本サイトで独自に作成。IPAの試験問題からの転載ではありません。
公開日:
選択肢を選んで、答え合わせをしましょう。
回答せずに正解・解説を確認する
正解:イ SQLの値をプレースホルダにして、入力をバインド変数として渡す
この表示だけでは、回答数や正答率は変わりません。
解説
パラメータ化したSQLでは、命令の構造を先に定め、利用者の入力を値として別に渡します。これにより、入力中の文字がSQLの構造を変えることを防ぎます。この問題は値の扱いを問うもので、表名や列名を動的に指定する状況とは区別しています。
クライアント側の制限は回避でき、短い入力でも命令として解釈される問題は残ります。
入力をSQLコードと分離し、値として扱う対策です。
HTTPSは通信経路を保護しますが、受信後にSQLへ連結する問題は残ります。
権限を増やすと侵害時の被害範囲が広がります。入力と命令の分離にもなりません。
関連知識
入力形式の検証とデータベース権限の最小化も追加の防御になります。表名やORDER BYの方向など、値用のプレースホルダにできない部分は固定の候補から選ぶなど、別の制御が必要です。
間違えやすいポイント
HTMLのエスケープとSQLの安全な組立ては別の処理です。画面に安全に表示できてもSQLが安全とは限りません。
覚え方
SQLの命令と入力の値を分ける。
実務での意味
検索、ログイン、帳票抽出など、利用者の入力をSQLへ渡す全経路で同じ方針を適用します。
解説:本サイト編集部によるオリジナル文章