【初心者向け】SQLインジェクションとは?仕組み・危険性・対策をIT業務初心者向けにやさしく解説
Webシステムの開発や保守に携わっていると、「SQLインジェクション」という言葉を耳にすることがよくあります。
「名前は聞いたことがあるけれど、実際にはどんな攻撃なの?」「SQLが関係していることは分かるけれど、どう危険なの?」という初心者の方も多いでしょう。
SQLインジェクションは、昔からある代表的なWebアプリケーションへの攻撃手法の一つです。現在では多くのフレームワークで対策が行われていますが、実装方法を誤ると今でも発生する可能性があります。
この記事では、IT業務を始めたばかりの方に向けて、SQLインジェクションの仕組みや危険性、対策方法、実務で知っておきたいポイントまで分かりやすく解説します。
SQLインジェクションとは?
SQLインジェクションとは、悪意のあるSQL文を入力欄などから送り込み、データベースを不正に操作しようとする攻撃です。
「Injection(インジェクション)」には「注入する」という意味があります。
つまり、攻撃者が本来実行されるはずではないSQL文をアプリケーションへ注入し、データベースを勝手に操作しようとする攻撃です。
簡単にいうと
家のインターホンに「こんにちは」と話しかける代わりに、「玄関の鍵を開けてください」という命令を送り込むようなイメージです。
本来は受け付けるべきではない命令を、システムがそのまま実行してしまうことが問題になります。
SQLとは?
SQL(Structured Query Language)は、データベースを操作するための言語です。
例えば次のような処理を行います。
- データを検索する
- データを追加する
- データを更新する
- データを削除する
Webシステムではログイン情報や商品情報、会員情報など、多くのデータがSQLを使って取得されています。
SQLインジェクションはどのように起こるのか
例えばログイン画面を考えてみます。
システムは入力されたユーザーIDとパスワードを使ってSQLを組み立てます。
SELECT * FROM users
WHERE id='入力値'
AND password='入力値';
ここで入力内容をそのままSQLへ埋め込んでしまうと問題になります。
攻撃者が特殊な文字列を入力すると、本来とは違うSQL文になってしまうことがあります。
その結果、認証をすり抜けたり、情報を取得されたりする危険があります。
このような状態をSQLインジェクションの脆弱性があるといいます。
SQLインジェクションで起こる被害
個人情報が漏えいする
会員情報や住所、電話番号などが取得される可能性があります。
データを書き換えられる
商品の価格変更やユーザー情報の改ざんなどが行われる恐れがあります。
データが削除される
重要なデータが削除されると、業務が停止する原因になります。
管理者権限を取得される
システムによっては管理者としてログインされる危険もあります。
実務ではどんな場面で意識する?
SQLインジェクションは、次のような画面で特に注意します。
- ログイン画面
- 検索画面
- お問い合わせフォーム
- 会員登録画面
- 商品検索
- 管理画面
- APIの入力値
「ユーザーが入力できる場所」は基本的にすべて注意が必要です。
SQLインジェクションを防ぐ方法
プレースホルダー(Prepared Statement)を使う
最も重要な対策です。
SQL文と入力値を分けて扱うため、入力された内容がSQLの命令として解釈されにくくなります。
現在の多くのプログラミング言語やフレームワークでは、この方法を利用できます。
入力チェックを行う
必要以上の文字や不正な入力を受け付けないようにします。
ただし、入力チェックだけでは十分な対策にはなりません。
権限を最小限にする
データベースへ接続するアカウントには必要最低限の権限だけを与えます。
万が一攻撃を受けても被害を小さくできます。
最新のフレームワークを利用する
Spring Boot、ASP.NET Core、Laravel、Djangoなどの主要フレームワークでは、標準機能でSQLインジェクション対策が行われています。
ただし、独自にSQLを組み立てる実装をすると脆弱性が発生する可能性があります。
新人エンジニアが覚えておきたいポイント
- SQL文字列を連結して作らない
- プレースホルダーを使用する
- レビューでSQLの書き方を確認する
- ユーザー入力は信用しない
- フレームワークの標準機能を利用する
実務では「SQLを文字列で連結しているコード」がレビューで指摘されることも少なくありません。
SQLインジェクションとXSS・CSRFの違い
| 攻撃 | 対象 | 目的 |
|---|---|---|
| SQLインジェクション | データベース | データの取得・改ざん・削除 |
| XSS | ブラウザ | JavaScriptを実行させる |
| CSRF | 利用者 | 本人になりすまして操作させる |
どれもWebアプリケーションで代表的な脆弱性ですが、攻撃対象や目的が異なります。
よくある質問
SQLインジェクションは今でも起こりますか?
はい。主要なフレームワークでは対策されていますが、SQLを自分で組み立てる実装などでは現在でも発生する可能性があります。
SQLを使わないシステムなら安全ですか?
SQLインジェクション自体はSQLを利用するデータベースが対象ですが、NoSQLを狙った「NoSQLインジェクション」と呼ばれる別の攻撃手法も存在します。
新人でも覚える必要がありますか?
はい。セキュリティの基礎知識として非常に重要です。コードレビューや設計の場面でも頻繁に登場するため、概要だけでも理解しておくことをおすすめします。
まとめ
SQLインジェクションは、悪意のあるSQL文を入力させることでデータベースを不正に操作しようとする攻撃です。
現在では多くの開発環境で対策されていますが、実装方法を誤ると脆弱性が発生する可能性があります。
IT業務では「ユーザー入力は信用しない」「SQLを文字列連結で作らない」「プレースホルダーを利用する」という基本を守ることが、安全なシステム開発につながります。
新人エンジニアのうちからSQLインジェクションの仕組みと対策を理解しておくことで、セキュリティを意識した開発ができるようになるでしょう。
