戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2017年 秋期 午前(科目A)39


問題文

SQLインジェクション攻撃の説明はどれか。

選択肢

Webアプリケーションに問題があるとき、悪意のある問合せや操作を行う命令文をWebサイトに入力して、データベースのデータを不正に取得したり改ざんしたりする攻撃(正解)
悪意のあるスクリプトを埋め込んだWebページを訪問者に閲覧させて、別のWebサイトで、その訪問者が意図しない操作を行わせる攻撃
市販されているDBMSの脆弱性を悪用することによって、宿主となるデータベースサーバを探して感染を繰り返し、インターネットのトラフィックを急増させる攻撃
訪問者の入力データをそのまま画面に表示するWebサイトを悪用して、悪意のあるスクリプトを訪問者のWebブラウザで実行させる攻撃

SQLインジェクション攻撃の説明はどれか【午前2 解説】

要点まとめ

  • 結論: SQLインジェクションは、Web入力欄やURLに不正なSQL文を注入してDBのデータを不正取得・改ざん・削除する攻撃手法です。
  • 根拠: 設問文の「問合せや操作を行う命令文をWebサイトに入力して、データベースのデータを不正に取得したり改ざんしたりする」という記述がまさにSQL文注入を指します。
  • 差がつくポイント: XSSやCSRFと混同しないこと。SQLiは「DBへ送る命令文を注入するか否か」を基準に見分けると確実です。

正解の理由

正解は です。アは「Webアプリケーションの入力箇所に悪意のある問合せや操作を行う命令文(=SQL文)を入力して、データベースのデータを不正に取得・改ざんする攻撃」と明確に説明しており、SQLインジェクションの定義に一致します。SQLインジェクションは、入力値をそのままSQLに連結して実行する実装ミスを突き、例えば "' OR '1'='1" や "UNION SELECT ..." 等のペイロードで認証回避やデータ抽出を行います。

よくある誤解

  • 「スクリプト実行=すべてXSS」と誤認する受験者が多く、画面上でスクリプトを走らせる攻撃(XSS)とDBに命令文を注入する攻撃(SQLi)を混同しやすい点。
  • SQLインジェクションは「データの閲覧だけ」の攻撃と考えがちだが、改ざん・削除やサーバ側でコマンド実行に繋がるケースもあるため軽視してはいけません。
  • 「GETだけで起きる」と思い込む誤解。POSTやヘッダ、Cookie、JSONボディ等あらゆる入力箇所が対象になります。

解法ステップ

  1. 設問文のキーワードを探す:「データベース」「問合せや操作を行う命令文」「入力して」「不正に取得」「改ざん」などを確認。
  2. 攻撃分類と照合する:DBへ命令文を注入するか(SQLi)、別サイトで操作を強制するか(CSRF)、ブラウザでスクリプトを実行させるか(XSS)で判定。
  3. 選択肢を絞る:DB操作が明示されている選択肢を正解とする。その他は用語(XSS/CSRF/ワーム等)と照らして除外。

選択肢別の誤答解説

  • : 正解。Web入力にSQL文を注入してDBを不正操作するという説明はSQLインジェクションそのものです。
  • イ: 誤り。別サイトで訪問者に意図しない操作を行わせる攻撃はCSRF(Cross-Site Request Forgery)です。悪意のあるスクリプトを埋め込む点があるが、CSRFは通常ユーザの認証情報を利用して「別サイトへリクエストを強制する」攻撃です。
  • ウ: 誤り。市販DBMSの脆弱性を悪用して感染を広げトラフィックを増やすのはワームやボットネットの振る舞いで、SQLインジェクションの説明ではありません。
  • エ: 誤り。訪問者のブラウザで悪意あるスクリプトを実行させる攻撃はXSS(Cross-Site Scripting)であり、DBへの命令注入を特徴とするSQLiとは異なります。

補足コラム

防御策の基本は入力の扱い方を変えることです。代表的対策は以下の通りです。
  • プリペアドステートメント・パラメータ化クエリを利用してSQLとデータを分離する。
  • 入力のホワイトリスト検証(型や長さ、許可文字のみ通す)。
  • 最小権限のDBアカウントを使い、不要な権限は与えない。
  • エラーメッセージに内部情報を出さない。ログ監視やWAFで異常なクエリを検出する。
簡単なコード例(悪い例と良い例、Python sqlite3):
# 悪い例:文字列連結でクエリを作る(SQLインジェクション脆弱)
user = "alice' OR '1'='1"
query = "SELECT * FROM users WHERE username = '" + user + "';"
cursor.execute(query)

# 良い例:パラメータ化クエリ(安全)
user = "alice' OR '1'='1"
query = "SELECT * FROM users WHERE username = ?;"
cursor.execute(query, (user,))
FAQ Q1: SQLインジェクションとXSSの違いは何ですか?
A1: SQLiは「データベースに送る命令文を注入」してサーバ側データを不正操作する攻撃、XSSは「ユーザのブラウザ上でスクリプトを実行」させる攻撃であり、対象(DBかブラウザか)が異なります。
Q2: SQLインジェクションの種類にはどんなものがありますか?
A2: 主にエラーベース、ブラインド(タイムベースやブールベース)、UNIONベースなどがあり、攻撃手法や情報取得の方法が異なります。
Q3: テストはどう行えば安全ですか?
A3: 権限を得た環境でのみ実施します。実運用DBを直接攻撃してはいけません。テスト用データベースと適切な承認プロセスを用意してください。
Q4: WAFだけで完全に防げますか?
A4: WAFは有効な補助ですが、完全ではありません。安全なコーディング(パラメータ化)と権限管理が第一です。

関連キーワード: SQLインジェクション、XSS、CSRF、プリペアドステートメント、パラメータ化クエリ、OWASP、入力検証、WAF、データベースセキュリティ、インジェクション攻撃
← 前の問題へ次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について