Webアプリを作り始めると、
「セキュリティって難しそう…」と感じませんか?😵💫
今回はその中でも超有名で超危険な攻撃
👉 SQLインジェクション を初心者向けに解説します!
🧨 1. SQLインジェクションとは?
SQLインジェクション(SQL Injection) とは、
🧑💻 ユーザーの入力欄を使って
💣 意図しないSQL文を実行されてしまう攻撃
のことです。
つまり…
本来は「データ」として扱うはずの入力を、データベースが「命令」として実行してしまう。すると👇
⚠️ データの漏洩・改ざん・ログイン突破などが起きます。
📌 2. よくある例:ログイン処理
それでは実際にログイン処理を見てみましょう👇
実行したいSQL
SELECT * FROM users
WHERE username = 'user'
AND password = 'pass';
Python風のコード(危険⚠️)
sql = f"""
SELECT * FROM users
WHERE username = '{username}'
AND password = '{password}'
"""
📌 ポイント
ユーザー入力を 文字列連結 しているのが問題です。
😱 攻撃されるとどうなる?
攻撃者がこんな入力をしたらどうでしょう?
入力内容
username: admin
password: ' OR '1'='1
実際に実行されるSQL
SELECT * FROM users
WHERE username = 'admin'
AND password = '' OR '1'='1';
🚪 ログイン突破の理由
'1'='1' は 必ず真(true)
OR があるので条件が成立
-
👉 パスワードが正しくなくてもログイン成功
-
😨 管理者ログイン突破も可能です。
🤔 なぜこんなことが起きるの?
原因はシンプルです👇
❌ SQL文とユーザー入力を 同じ「文字列」 として扱っている
その結果…
DBが「命令」と「データ」を区別できない
その結果、攻撃用のSQLがそのまま実行される
📌 一言で言うと
データベースに「これは命令です」と教えていない
✅ 3. SQLインジェクション対策
① プレースホルダ(最重要🔥)
プレースホルダを使うと安全になります。
安全な書き方(Python例)
sql = """
SELECT * FROM users
WHERE username = %s
AND password = %s
"""
cursor.execute(sql, (username, password))
なぜ安全?
%s は「穴」🕳️
値は後から安全に埋め込まれる
DBが 命令とデータを完全に分離して処理
👉 SQLを書き換えられなくなる!
② ORMを使う(初心者におすすめ✨)
ORM(Object Relational Mapper) を使うと、SQLを直接書かずにDB操作できます。
Django ORMの例
User.objects.get(username=username, password=password)
📌 ポイント
-
内部で安全なSQLを生成
-
基本的にSQLインジェクションを防げる
💡 Django / Rails / SQLAlchemy を使っているなら、ORMを使うのが安心です。
❌ よくある勘違い(要注意⚠️)
- ❌ 入力チェックすればOK
- ❌ エスケープすればOK
- ❌ 管理画面だから安全
👉 全部NGです
✅ 正解は
プレースホルダ or ORM
📝 4. おわりに
✅ SQLインジェクションは今でも危険
✅ 原因は「文字列連結」
✅ 対策は プレースホルダ or ORM
🔐 セキュリティは「知っているだけ」で防げることが多いです!
最後までご覧いただきありがとうございました!🎉
よろしければ他の記事も是非ご覧頂けるとすごくうれしいです。
👍 いいね / 💬 コメントいただけると励みになります!