問10 SQL インジェクションの対策

基本情報​技術者試験 令和6年度 公開問題 科目A、全20問のうちの問10。

出典:令和6年度 基本情報技術者試験 公開問題 科目A 問10

SQL インジェクションの対策として,有効なものはどれか。

  1. アURL を Web ページに出力するときは,“http://”や“https://”で始まる URL だけを許可する。
  2. イ外部からのパラメータで Web サーバ内のファイル名を直接指定しない。
  3. ウスタイルシートを任意の Web サイトから取り込めるようにしない。
  4. エプレースホルダを使って命令文を組み立てる。
答えと解説を開く

正解はエです。

SQL インジェクションは、入力欄に SQL の一部になる文字列を入れて、プログラムが組み立てる SQL 文の意味を変えてしまう攻撃です。たとえば、入力をそのまま文字列としてつなげて SQL 文を作ると、' OR '1'='1 のような入力で、条件が常に成り立つ文に変えられてしまいます。プレースホルダは、SQL 文の値を入れる場所を ? などの記号にしておき、あとから値だけを渡す方式です。値は SQL の文法として解釈されないので、命令の形は変わりません。正解はエです。

ほかの選択肢が違う理由

  • ア出力する URL を http や https の形式で始まるものだけに限るのは、スクリプトを動かす形式の URL を埋め込まれるクロスサイトスクリプティングの対策です。
  • イ外部からの入力でファイル名を直接指定させないのは、ディレクトリトラバーサル (パストラバーサル) の対策です。
  • ウ任意のサイトからスタイルシートを取り込ませないのは、クロスサイトスクリプティングなどで画面を細工されることへの対策です。SQL 文とは関係しません。

仕組み

SQL インジェクションの根本の原因は、データ (入力の値) と命令 (SQL 文) の区切りがあいまいになることです。プレースホルダは、命令と値を別々に DBMS へ渡すことで、この区切りを守ります。

プレースホルダを使い、値をあとから当てはめる仕組みをバインド機構と言います。多くの言語のデータベース用ライブラリが、プリペアドステートメントとして用意しています。

この問に出る言葉