SONAE KNOWLEDGE / PHP SECURITY / 05

PHPのSQLインジェクション対策。PDOを使っても残る連結を見直す

値とSQL構造を分け、並べ替え・検索・テナント境界まで点検する。値と構造の確認票付き。

公式資料確認:2026-10-26/AIによる資料確認・執筆

公式情報には各節で出典を付けています。確認表・架空例・受入条件はSONAEの提案です。制作と資料確認にAIを使用。本人の編集確認は未了です。専門家による独立した監修は受けていません。

値は、SQLの文法にしない

PHP公式はプリペアドステートメントの利点を説明する一方、別の箇所で未処理の入力を連結すればSQLインジェクションが残ると注意しています。PDOを使っているという製品名だけでは判断できません。SONAEは、利用者の入力がどこでSQLへ渡るかを、検索、更新、帳票ごとに確認する方法を提案します。

公式情報:PHP公式:プリペアドステートメント(確認 2026-10-26)

プレースホルダーで置き換えられる範囲

PDO::prepareのパラメーターは、データの値を表すためのものです。テーブル名、列名、キーワードなどSQLの構造全体を置き換える用途にはできません。並べ替えに対応する例では、画面上の選択肢を、開発者が管理する固定の列名へ対応させます。利用者の文字列をそのまま列名へ差し込む設計を残さないようにします。

公式情報:PHP公式:PDO::prepare(確認 2026-10-26)

入力は「値」と「構造」で別の経路へ

入力は「値」と「構造」で別の経路へSQLの安全化と、レコードへの認可は別の条件です。特定DBの設定を保証する図ではありません。01検索の値パラメーターへ渡す02並べ替えの選択固定の対応表で選ぶ03会社ごとの認可読めるレコードを限定入力をSQL文へ直結値の連結と列名の流用を止める独立した条件を、別の証拠で確認入力は「値」と「構造」で別の経路へSQLの安全化と、レコードへの認可は別の条件です。特定DBの設定を保証する図ではありません。01検索の値パラメーターへ渡す02並べ替えの選択固定の対応表で選ぶ03会社ごとの認可読めるレコードを限定入力をSQL文へ直結値の連結と列名の流用を止めるそれぞれの確認結果を記録
SQLの安全化と、レコードへの認可は別の条件です。特定DBの設定を保証する図ではありません。
図の内容を文章で読む

検索の値:パラメーターへ渡す。並べ替えの選択:固定の対応表で選ぶ。会社ごとの認可:読めるレコードを限定。進めない判断:入力をSQL文へ直結/値の連結と列名の流用を止める。SQLの安全化と、レコードへの認可は別の条件です。特定DBの設定を保証する図ではありません。

検索の便利さと、許可する範囲を分ける

SONAEの架空例では、受注検索のキーワードは値として渡し、並べ替えは「受付順」「金額順」の二つだけを固定の対応表で選びます。検索語の長さ、件数上限、ページ送りも業務要件へ合わせます。引用符を消すだけの加工や、危険そうな単語の除去を中心の防御にしません。文字を消して検索結果が変わる処理は、仕様としても説明しにくくなるためです。

SONAEの点検・運用提案。架空例。

会社の境界は、SQLの安全化とは別に見る

OWASPは対象と機能への認可をリクエストごとに検証するよう説明しています。SQLの値を安全に渡せても、別会社の注文番号で資料が読めれば問題は残ります。SONAEの受入案では、会社Aの架空利用者が会社Bの架空レコードへアクセスできないことを、一覧、詳細、更新、出力のそれぞれで確認します。

公式情報:OWASP:リクエストごとの認可(確認 2026-10-26)

修正の受入は、通常処理と拒否の両方

確認用の別環境では、通常の日本語検索、空欄、引用符を含む自然な文字列、長い入力などの期待結果を先に決めます。エラー時にSQL全文や接続情報が画面へ出ないことも受入へ含めます。ここでは攻撃用文字列を顧客へ送る試験は行いません。実際の試験方法と対象は、管理する権限と承認のある範囲で別途決める必要があります。

SONAEの点検・運用提案。架空例。

修正箇所の一覧を、次の開発へ残す

検索一か所を直した結果をアプリ全体へ広げず、確認した処理、クエリーを組み立てる共通部品、未確認の経路を対応させます。AI生成コードを採用した場合も同じ受入を適用します。生成元が何かより、値の境界、許可する構造、認可、エラー時の情報が実際にどう扱われるかで確認しましょう。

SONAEの点検・運用提案。架空例。

開発担当へ渡す、検索機能の受入計画

架空の受注検索では、会社Aの利用者が自社の注文だけを読み、件数制限の範囲で並べ替えられることを先に期待結果へ書きます。入力として日常の氏名や製品名に含まれる引用符を扱い、処理が失敗してもSQL本文や接続先が利用者に表示されないことを確認します。不明な並べ替え値は固定の既定値にするか拒否するかを仕様で決めます。会社の識別は認証済みの文脈と照合し、送られた会社番号だけに依存しません。CSV出力が別実装なら同じ確認を追加します。この表は試験計画で、実アプリで合格した結果ではありません。

SONAEの点検・運用提案。架空例。

架空環境での受入計画

以下は未実行の計画です。実測の合格記録ではありません。

通常の日本語検索
条件:会社Aの架空データ
期待結果:許可した自社データだけ表示
不明な並べ替え値
条件:固定表に存在しない
期待結果:仕様どおり拒否か既定値
別会社のレコード
条件:会社Bの架空注文
期待結果:閲覧・変更・出力を拒否
DB処理が失敗
条件:検証用の失敗条件
期待結果:利用者へSQLや秘密を出さない

社内で使う確認票

SONAEの運用案・架空例。秘密の値を記入しないでください。

処理
架空:受注検索・詳細・CSV・更新
境界
値・固定の列名・会社の識別方法
確認
通常入力・拒否・別会社・エラー表示
結果
対象版・確認者・未点検の経路・期限

完了前のチェック

  • 値のパラメーター化と構造の許可表を区別
  • 一部の文字列連結を残さない
  • 別会社のデータへの認可を確認
  • 通常処理と拒否の期待結果を記録

一次資料と確認範囲

資料の対象条件と掲載内容を確認して構成した記事です。顧客への接続や攻撃再現はしていません。資料の改訂を自動追従するものではありません。実施直前に公式資料と配布元の最新案内を再確認してください。