【えすきゅーえるいんじぇくしょん】

SQLインジェクション とは?

💡 入力欄から「不正なSQL」をデータベースに流し込む
📌 このページのポイント
SQLインジェクション 正常な入力 ユーザー名: taro SELECT * FROM users WHERE name = 'taro' 悪意ある入力 ユーザー名: ' OR 1=1 -- SELECT * FROM users WHERE name = '' OR 1=1 --' 1件のみ取得 全件取得! データベース 対策:プリペアドステートメント(パラメータ化クエリ)を使用する
入力値を利用してSQL文を改ざんし、不正にデータを取得する攻撃
ひよこ ひよこ

どんな攻撃なの?

ペンギン先生 ペンギン先生

ログインフォームのパスワード欄に「' OR '1'='1」と入力すると、SQLが「SELECT * FROM users WHERE password = '' OR '1'='1'」に変化して、条件が常にtrueになり全ユーザーでログインできてしまう。入力値をそのままSQLに組み込むと、攻撃者が自由にSQLを操れてしまうんだ

ひよこ ひよこ
ペンギン先生 ペンギン先生

SQL文と値を分離して渡す仕組みだよ。「SELECT * FROM users WHERE id = ?」のように?をプレースホルダーにして、値は別パラメータで渡す。値は常に「データ」として扱われるから、SQL命令として解釈されない。これが唯一の根本的対策。文字列連結でSQLを組み立てるのは絶対NGだよ

ひよこ ひよこ

ORMを使えば安全?

ペンギン先生 ペンギン先生

ORMの標準機能(Prisma、SQLAlchemy、ActiveRecord等)を使えばほぼ安全だよ。ORMが内部でプリペアドステートメントを生成してくれる。ただし、ORMの「生SQLを実行する」機能を使う場合は注意が必要。また、検索条件の動的組み立てなどで脆弱になるケースもあるよ

ひよこ ひよこ

実際の被害は?

ペンギン先生 ペンギン先生

2011年のソニーPSN事件(7,700万件の個人情報流出)はSQLインジェクションが原因の一つ。2017年のEquifax事件(1.4億件の信用情報流出)もWebアプリの脆弱性が起点。日本でもECサイトからのクレジットカード情報流出事件が毎年のように発生している。基本的な対策を怠ると壊滅的な被害になるんだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
SQLインジェクション」って出てきたら「入力欄からDBに不正なクエリを送り込む攻撃」と思えればだいたいOK!
📖 おまけ:英語の意味
「SQL Injection」 = SQL注入
💬 Injection(注入)。ユーザー入力にSQLを「注入」して不正実行させる攻撃だよ
← 用語集にもどる