SQLインジェクションとは
SQLインジェクションとは、Webアプリケーションが、利用者の入力をデータベースへの命令(SQL)に組み込む際の不備を突いて、攻撃者が意図しない命令を実行させる攻撃です。結果として、情報の漏えい、改ざん、削除などの被害につながるおそれがあります。
たとえば、ログイン画面の入力欄に、特殊な文字列を入れることで、パスワードの確認を回避されるといった事例が知られています。
原因は、入力された文字列を、単なるデータではなく命令の一部として扱ってしまう実装にあります。古くから知られる攻撃ですが、対策が不十分なために、今も被害が報告されています。
仕組み・ポイント
攻撃が成立する仕組みと、対策を整理します。
| 項目 | 内容 |
|---|---|
| 原因 | 入力を直接つなぎ合わせて命令を作っている |
| 被害の例 | 情報の漏えい、データの改ざんや削除 |
| 主な対策 | 命令とデータを分離する書き方(プレースホルダなど) |
| 補助的な対策 | 入力の検証、データベースの権限の制限、エラー表示の制御 |
根本的な対策は、プレースホルダ(変数の場所を示す記号)を使い、入力を命令の一部ではなく、単なるデータとして扱う書き方にすることです。多くの開発の枠組みが、安全な書き方を提供しています。
加えて、データベースの接続に使うアカウントの権限を必要最小限にしておくと、仮に侵入されても、被害を小さくできます。エラーの詳細を利用者に見せない設定も、攻撃のヒントを与えないために重要です。
実務での使い方・具体例
架空の例として、会員の検索機能を作る場面を考えます。検索の文字列を、そのまま命令に組み込む実装では、攻撃の危険があります。そこで、プレースホルダを用いた書き方にし、入力はデータとしてのみ扱います。
さらに、データベースに接続するアカウントは、検索に必要な権限だけにします。公開前に、脆弱性診断で、入力欄が悪用されないかを確認します。開発の際のコードの確認でも、命令を文字列の連結で作っていないかを、チェックの項目に入れておきます。制度や基準は変わるため、最新情報は専門家で確認してください。
外部の部品や枠組みを使う場合も、それらが安全な書き方を提供しているかを確認し、更新の情報を追い続けます。日々の開発では、基本的な安全の書き方を、チームの共通の約束として文書にしておくと、担当者が替わっても守られます。
判断のチェックポイント
- 命令の作成に、プレースホルダを使っているか
- 入力を、命令の一部として扱っていないか
- データベースの接続アカウントの権限を絞っているか
- エラーの詳細を、利用者に表示しない設定か
- コードの確認の項目に、この観点を入れているか
- 公開前に、診断で確認する計画があるか
よくある誤解と注意点
- 入力の文字を取り除くだけでは十分でない:根本は、命令とデータの分離です。
- 古い攻撃だから対策済みとは限らない:実装の不備で、今も発生します。
- WAFだけで守れるとは限らない:アプリの実装の修正が根本の対策です。
- 一部の画面だけでなく全体を確認する:見落としが一か所でもあると狙われます。
- 外部の部品も確認する:使っている部品が原因となる場合もあります。
関連用語
- 脆弱性(セキュリティホール):攻撃に使われる弱点
- WAF(ウェブアプリケーションファイアウォール):攻撃を抑える仕組み
- XSS:Webアプリケーションを狙う別の代表的な攻撃
- SQL:攻撃の対象になるデータベースの言語
Otsumuに相談できること
基本的な安全対策は、後から付け加えるより、設計と実装の段階から組み込むほうが低い負担で済みます。Otsumuでは、公開前に押さえるべき確認項目を、事業の状況に合わせてご一緒に整理できます。
MVP開発のご支援内容もご覧いただけます。進め方に迷う段階であれば、30分の無料相談でお話しください。
執筆:Otsumu株式会社 / 編集日 2026.10.04