「玄関の鍵をかけたはずなのに…」SQLインジェクションという名の“合鍵”を防ぐには?
こんにちは。セキュリティの世界へようこそ。
「システムを作ったけれど、攻撃なんて自分には関係ないよね」と思っていませんか?実は、あなたの作ったアプリケーションが、知らない間に“合鍵”を作られて、泥棒に自由に出入りされている……そんな恐ろしいことが、ネットの世界では日常的に起きています。
今日は、その代表格である「SQLインジェクション」について、泥棒の侵入経路を例え話にしながら、私たちがどうやってそれを防ぎ、見張りをするのかを紐解いていきましょう。
—
1. SQLインジェクションって、結局なに?
私たちのアプリケーションは、ユーザーから入力された情報(名前やパスワードなど)をもとに、裏側のデータベース(情報の金庫)へ問い合わせに行きます。
想像してみてください。あなたは家の玄関に「名前を書いてくれたら中に入れてあげるよ」という受付表を置きました。
- 普通のお客さん: 「山田太郎」と書く。→ あなたは「山田さんですね」と中に入れる。
- 悪い泥棒: 「山田太郎‘ OR ‘1’=’1」と書く。
ここで泥棒が書いた後半の呪文(' OR '1'='1)が曲者です。本来、あなたは「名前が一致する人だけ」を探したかったはずなのに、この呪文が混ざることで、データベースは「全員の情報を出して!」という命令だと勘違いしてしまうのです。これがSQLインジェクションの正体です。
—
2. 「番人」を置こう:WAFのシグネチャ設定
泥棒が家に入ってくる前に、玄関で怪しい奴を追い返すのがWAF(ウェブ・アプリケーション・ファイアウォール)の役割です。
WAFは、入ってきた「名前」の中に「怪しい言葉」が含まれていないかチェックする番人です。例えば、以下のようなキーワードを検知するように設定します。
WAFの監視対象リスト(シグネチャ)の例
UNION SELECT:勝手に別のデータ棚の中身を覗き見ようとする呪文。--または#:後ろに続く命令を無効化する「コメントアウト」という手法。泥棒が文章を書き換えるときによく使います。OR 1=1:先ほど紹介した、全員を開錠させてしまう魔法の言葉。
設定のポイント:
WAFは、ただ遮断するだけでなく「ログ」を残すことが重要です。「誰が」「いつ」「どんな呪文を使って」入ろうとしたのか。このログが、次にどんな防犯対策をすべきかの貴重な教科書になります。
—
3. アプリケーションログの「異常」を見抜く
WAFを通り抜けてくる巧妙な攻撃も存在します。だからこそ、アプリケーション自体でも「あ、今のクエリは変だな」と気づける仕組みが必要です。
データベースに送られるクエリをログに出力するとき、以下のようなパターンがないか監視してみましょう。
/ 正常なログの例 /
SELECT FROM users WHERE username = ‘yamada’;
/ 異常なログの例(こんなクエリが走っていたら要注意!) /
SELECT FROM users WHERE username = ‘yamada’ OR ‘a’=’a’;
— なぜか突然、条件が「または正しい」というものに変わっている
開発の現場では、「プレースホルダ(バインド変数)」という仕組みを使うのが、何よりの防犯対策です。これは、入力内容を「命令」としてではなく、ただの「ただの文字列」として扱う魔法の箱です。
悪い例(泥棒に命令を書き換えられる)
query = “SELECT FROM users WHERE name = ‘” + user_input + “‘”
良い例(プレースホルダを使う:これなら呪文もただの文字として扱われる!)
cursor.execute(“SELECT FROM users WHERE name = %s”, (user_input,))
—
4. 今日からできる「一歩」の習慣
セキュリティは完璧を目指すものではなく、「泥棒が面倒くさがって諦める仕組み」を作ることです。以下の3つを今日から意識してみてください。
1. 「疑うこと」を忘れない: ユーザーからの入力は、すべて「悪意があるかもしれない」と疑ってかかるのが、優秀なエンジニアの第一歩です。
2. ログを眺める癖をつける: 毎日とは言いません。週に一度、ログに「UNION」や「SELECT」といった単語が並んでいないか、チラッと見てみてください。
3. ライブラリを信頼しすぎない: 便利なフレームワークも万能ではありません。基本は「プレースホルダ」を使うこと。これだけで、攻撃の9割は防げます。
—
セキュリティ対策は、筋トレと同じです。一気にやろうとすると疲れてしまいますが、少しずつ習慣化すれば、あなたの作るシステムは誰よりも強固な城になります。
もし迷ったら、いつでもまたここへ戻ってきてください。私たちは、安全なウェブの未来を一緒に作る仲間ですからね。それでは、また!
コメント