令和6年度 科目A10テクノロジ系

基本情報 令和6年度 科目A 問10:テクノロジ系に関する問題

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

  • aURL をWeb ページに出力するときは,“http://”や“https://”で始まるURL だ けを許可する。
  • b外部からのパラメータでWeb サーバ内のファイル名を直接指定しない。
  • cスタイルシートを任意のWeb サイトから取り込めるようにしない。
  • dプレースホルダを使って命令文を組み立てる。 - 6 -正答
正答:Dプレースホルダを使って命令文を組み立てる。 - 6 -

AI解説(初心者・標準・上級)

理解度に合わせて3レベルの解説を無料で読めます。

初心者向けまずはここから。やさしく要点を解説

答えは d です。

SQLインジェクション=Webサイトの入力欄に悪意あるSQL文(DBへの命令)を混ぜて、データベースを盗み見る攻撃。

対策は プレースホルダ=SQL文の中に「ここに値を入れる箱」を作っておき、ユーザーの入力をただのデータとして扱う仕組み。

たとえば「お名前は○○」の○○に「'; DROP TABLE users;--」って書かれても、プレースホルダを使えば文字列としてしか扱わないから、命令として実行されません。

👉 覚え方:プレースホルダ=場所取り=ユーザー入力を“ただの文字”扱いにする

ほかの選択肢:a URLチェック=オープンリダイレクト対策/b ファイル名直接指定回避=ディレクトリトラバーサル対策/c スタイルシート制限=CSS injection対策。全部別の攻撃の対策。

標準試験対策の基準レベル

なぜこれが正解か

正解は d。SQLインジェクションは、ユーザー入力をSQL文に文字列連結することで、攻撃者が任意のSQL命令を実行可能になる脆弱性。プレースホルダ(プリペアドステートメント/パラメータ化クエリ)を使うと、SQL文の構造とパラメータが分離され、入力値はリテラル(データ)としてのみ扱われるため、構文として解釈されず根本的に防げる。

各選択肢の解説

  • a URLスキーマ制限:オープンリダイレクトXSS(javascript:スキーマ)対策。
  • b ファイル名直接指定回避:ディレクトリトラバーサル(パストラバーサル、../による上位ディレクトリアクセス)対策。
  • c 任意CSS取り込み禁止:CSSインジェクション/CSPバイパス対策。

覚え方・ひっかけ注意

SQLインジェクション対策の本命=プレースホルダで即答可。エスケープ処理は次善策(DB方言や文字コードで漏れが出る)、WAFは多層防御の補助であって根本対策ではない。最小権限の原則(DBユーザーに必要最小限のSELECT等のみ付与)と組合せると被害を限定できる。

上級誤答論破・背景理論まで深掘り

理論的背景・仕組みの詳細

プレースホルダはSQL文の準備(Prepare)実行(Execute)を分離する仕組み。Prepare段階でDBサーバーが構文解析・実行計画作成を行い、Execute段階で値のみを渡すため、値がSQL構文の一部として再解釈されることがない。実装方式は2系統:

  • サーバサイドプリペアドステートメント:Prepare文をDBに送り、実行計画をキャッシュ。性能向上効果もあり。
  • クライアントサイドエミュレーション:ドライバ側でエスケープ処理してSQL文を組み立て。一部レガシードライバで採用。

PDOのデフォルトは ATTR_EMULATE_PREPARES=true でクライアントサイドだが、セキュリティ的にはサーバサイド推奨。

実務での使われ方・関連規格/法令

言語別の標準API:

  • Java:PreparedStatement(JDBC)、JPA `:param` バインド、MyBatis `#{param}`(`${}`は危険)
  • PHP:PDO prepared statements、mysqli prepared statements
  • Python:DB-API 2.0 `cursor.execute(sql, params)`、SQLAlchemy text() bindparams
  • C#:SqlCommand with SqlParameter、Dapper の `@param`
  • Node.js:mysql2/promise の `?` プレースホルダ、Knex/Prismaのバインド
  • ORM:Active Record(Rails)、Sequelize、Drizzle、Prisma は基本的に安全だがraw SQL注入箇所は要レビュー

標準・ガイドライン:OWASP Top 10 2021 A03:2021 Injection(旧A1から順位低下したが依然重要)、OWASP ASVS V5(Validation, Sanitization and Encoding)CWE-89(SQL Injection)PCI DSS v4.0 6.2.4経産省「安全なウェブサイトの作り方」(IPA)。日本では2005年〜カカクコム・GENO事件以降、大規模情報漏えいの主要原因として継続的に発生。

試験での位置づけ

FE科目Aセキュリティ領域で毎回必出。「プレースホルダ」「バインド機構」がキーワード。応用情報技術者では、ブラインドSQLi(time-based / boolean-based)、Second-Order Injection、NoSQLインジェクション(MongoDB演算子注入)、ORMインジェクションまで踏み込む。情報処理安全確保支援士試験では、WAF(ModSecurity、AWS WAF、Cloudflare)のシグネチャ運用、サニタイズ vs エスケープ vs バインドの優先順位論述が問われる。

選択肢の発展補足

他選択肢の本来の対策対象:

  • a → オープンリダイレクト:CWE-601、ホワイトリスト方式(許可ドメインリスト)+ 相対URL強制が定石
  • b → ディレクトリトラバーサル:CWE-22、realpath()正規化+ベースディレクトリ配下確認、Path APIのresolve+startsWith検証
  • c → CSSインジェクション:データ漏えい(属性値の文字単位抜き出し攻撃)、CSP `style-src`制限+ nonce/hash運用

現代の Web 脆弱性対策はDefense in Depth+Secure by Default(フレームワーク・ORMが安全な書き方を強制)の方向。React・Vue は XSS、Rails の strong_parameters はマスアサインメント、Spring の `@PreAuthorize` は認可制御を標準化。SQLi も ORM 普及で激減したが、Raw SQL の混在箇所、動的テーブル名・カラム名、ORDER BY節は今もインジェクション残存リスクが高く、コードレビュー必須項目である。生成AI時代ではLLMコーディング補助がSQLi脆弱コードを生成する事例も観測されており、SASTツール(Snyk、Semgrep)でのCI/CDゲートがより重要になっている。

出典・引用について

出典:IPA(情報処理推進機構)公式 基本情報技術者試験 令和6年度 科目A10/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。

テクノロジ系の他の過去問

1
テクノロジ系
2
テクノロジ系
3
テクノロジ系
4
テクノロジ系
5
テクノロジ系

あなたの弱点を診断して、合格までの最短ルートを

この分野を連続演習し、AIがあなたの弱点を分析。合格ナビなら基本情報の過去問を解きながら学べます。