検索処理の例で、SQLの文字列連結と値のバインドの違いを詳しく説明します。

文字列連結で生まれる問題
検索画面で受け取った文字列を、そのままSQL文につなげる設計では、入力の一部がSQLの命令として解釈される可能性があります。画面で文字数や形式を制限しても、サーバーへ送られる要求が必ずその画面を通るとは限りません。対策は、データを受け取ってSQLを実行する側に必要です。
命令の形を先に固定する
OWASPが紹介するパラメータ化クエリは、SQLの構造を先に定義し、検索対象などの値を別に渡す方式です。例えば説明用の検索文「SELECT name FROM customers WHERE customer_id = ?」では、末尾の値をライブラリの正式なバインド機能で渡します。入力内容をSQLへ文字列として貼り付ける処理とは異なります。記号や書式は利用する言語・データベースによって変わります。
ライブラリを使っていても境界は残る
データベース操作を簡略化するORMを採用していても、その中で生のSQLを文字列連結していれば、同じ種類の欠陥を持ち込む可能性があります。処理の名前や使用製品だけで判断せず、利用者の入力が実行時にどのように渡されるかを見る必要があります。
防げることと、別に必要なこと
パラメータ化は、入力を命令として解釈させないための対策です。例えば別の顧客番号を指定したとき、その顧客の情報を閲覧してよいかという権限判定まで代わりに行うものではありません。型や桁数など業務上の入力検証と、利用者ごとの閲覧権限も必要です。この検索例は仕組みを説明するための架空の例であり、特定企業の事故原因を示すものではありません。
OWASP Query Parameterization Cheat Sheet
記事更新・資料確認日:2026年9月12日。事例・注意喚起の時点は本文に記載しています。
最新ニュース
12|SQL対策:入力値と命令を分けるパラメータ化
26/9/11
執筆者:
