基本情報技術者試験過去問 令和6年度(2024年)科目A問10
SQLインジェクションの対策として,有効なものはどれか。
選択肢
- ア:URLをWebページに出力するときは,“http://”や“https://”で始まるURLだけを許可する。
- イ:外部からのパラメータでWebサーバ内のファイル名を直接指定しない。
- ウ:スタイルシートを任意のWebサイトから取り込めるようにしない。
- エ:プレースホルダを使って命令文を組み立てる。
- ア
- イ
- ウ
- エ
正解と解き方・学習ポイント(AI解説)
SQLインジェクションは、外部入力を文字列連結などでSQL文に埋め込むことで、入力値がSQLの命令として解釈されてしまう攻撃です。プレースホルダを用いてSQL文の構造と入力値を分離し、値をバインドして実行すると、入力値が命令として扱われにくくなるため有効です。
Point
この問題は、SQLインジェクションの原因が「SQL文の構造に入力値が混ざること」である点と、代表的な対策が「プレースホルダによるパラメータ化」である点を理解しているかを確認するものです。
解くために必要な知識
この問題を解くには、SQLインジェクションの仕組みと対策、および他のWeb攻撃手法との違いについての理解が必要です。
用語の整理
| 用語 | 意味 |
|---|---|
| SQLインジェクション | 入力値に不正なSQLの断片を混ぜ、SQL文として解釈させてデータベースに想定外の処理を実行させる攻撃です。 |
| プレースホルダ | SQL文中の値の位置を「?」などで固定し、値は別に渡してDBが安全に埋め込む仕組みです。パラメータ化クエリと呼ばれることもあります。 |
プレースホルダが有効な理由
SQL文を文字列連結で作ると、入力値がSQLの構文として解釈される可能性があります。
プレースホルダを使うと、次のようにSQL文と値を分離します。
-
SQL文(構造): SELECT * FROM users WHERE id = ?
-
値(データ): 1
この分離により、値がSQL命令として扱われにくくなり、SQLインジェクションの成立を防ぎます。
他の選択肢に出てくる用語
| 用語 | 意味 |
|---|---|
| Webサーバ | HTTP/HTTPSの要求を受け取り、WebページやAPI応答を返すサーバです。 |
| パラメータ | URLクエリやフォームなど、外部から渡される入力値です。 |
| スタイルシート(CSS) | Webページの見た目を指定する仕組みです。 |
選択肢ごとの解説
- ア:不正解
URLを http:// や https:// の形式に制限することは、意図しないサイトへ誘導する問題への対策として扱われることがありますが、SQL文の組み立てとは関係しないためSQLインジェクション対策にはなりません。よって誤りです。
- イ:不正解
外部入力でWebサーバ内のファイル名を直接指定させないのは、意図しないファイル参照を防ぐ考え方です。DBに送るSQL文の改ざんを防ぐ対策ではないため、SQLインジェクション対策にはなりません。よって誤りです。
- ウ:不正解
外部サイトからのスタイルシート読み込みを制限するのは、外部リソースに起因するリスクを減らす考え方です。SQLの組み立て方法を改善するものではないため、SQLインジェクション対策としては直接的ではありません。よって誤りです。
- エ:正解
プレースホルダを使うと、SQL文の構造と入力値を分離してDBに渡せます。入力値がSQL命令として解釈されにくくなり、不正なSQLの実行を防げるため、SQLインジェクションへの有効な対策です。よって正解です。
まとめ
SQLインジェクションは、外部入力を文字列連結などでSQL文に埋め込むことで、入力値がSQLの命令として解釈されてしまう攻撃です。プレースホルダを用いてSQL文の構造と入力値を分離し、値をバインドして実行すると、入力値が命令として扱われにくくなるため有効です。
URLを http:// や https:// の形式に制限することは、意図しないサイトへ誘導する問題への対策として扱われることがありますが、SQL文の組み立てとは関係しないためSQLインジェクション対策にはなりません。よって誤りです。
外部入力でWebサーバ内のファイル名を直接指定させないのは、意図しないファイル参照を防ぐ考え方です。DBに送るSQL文の改ざんを防ぐ対策ではないため、SQLインジェクション対策にはなりません。よって誤りです。
外部サイトからのスタイルシート読み込みを制限するのは、外部リソースに起因するリスクを減らす考え方です。SQLの組み立て方法を改善するものではないため、SQLインジェクション対策としては直接的ではありません。よって誤りです。
プレースホルダを使うと、SQL文の構造と入力値を分離してDBに渡せます。入力値がSQL命令として解釈されにくくなり、不正なSQLの実行を防げるため、SQLインジェクションへの有効な対策です。よって正解です。