SQLインジェクションとNoSQLインジェクション
🔥 Vibe プロンプト
「ログインAPIをSQLiテスト。脆弱なクエリとパラメータ化クエリを比較。MongoDB NoSQLiもテスト。」
import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE users (id INT, username TEXT, password TEXT)")
conn.execute("INSERT INTO users VALUES (1, 'admin', 'secret123')")
def vulnerable_login(username, password):
query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
return conn.execute(query).fetchone() is not None
print(f"SQLi成功: {vulnerable_login("admin'--", "任意")}")
# 安全: パラメータ化
safe = "SELECT * FROM users WHERE username=? AND password=?"
print(f"安全: {conn.execute(safe, ('admin'"'--", '任意')).fetchone()}")
# NoSQLi: {"password": {"$ne": ""}} で認証バイパス
# 対策: サーバーサイドでハッシュ化して比較
防止策
| 技術 | 方法 |
|-----|------|
| パラメータ化クエリ | WHERE id = %s |
| ORM | SQLAlchemy, Prisma |
| 入力検証 | 特殊文字を拒否 |
| 最小権限 | DBユーザー = SELECTのみ |
ブラインドSQLi
' OR 1=1 -- # 常に真
' AND 1=2 -- # 常に偽
' AND SLEEP(5) -- # 時間ベース検出
重要なポイント
- コアコンセプトをしっかり理解する
- ハンズオンコード例で実践する
- 実世界の問題に応用する
- 演習で知識を強化する
さらに学ぶ
- 公式ドキュメント
- GitHubのオープンソースプロジェクト
- コミュニティフォーラムとディスカッション
- 関連コースとチュートリアル