泥棒は「窓の隙間」を見逃さない。Webアプリの守りを固める「ホワイトリスト」の極意
こんにちは。セキュリティの現場で日々、複雑なインシデントと向き合っているエンジニアです。
今日は、Webアプリケーションを守るための最も基本的でありながら、最も奥が深い「入力値バリデーション」のお話をします。
「バリデーション? 難しそうだな…」と思ったあなた、大丈夫です。まずは、あなたの家の防犯を想像してみてください。
—
1. 泥棒の視点:ブラックリスト方式の「詰め」の甘さ
皆さんの家には「鍵」がかかっていますよね。では、もし皆さんが泥棒を追い払うために、「泥棒リスト(ブラックリスト)」を作って玄関に貼っておくとします。
- 「〇〇という顔の奴は入るな」
- 「△△という服を着ている奴は入るな」
…これ、泥棒からすれば笑いが止まりませんよね。リストに載っていない新しい服装の泥棒が来たら、いとも簡単に侵入できてしまうからです。
Webの世界での「ブラックリスト方式」もこれと同じです。DROP TABLEという文字列を弾く、タグを消す……これらは攻撃の手口が既知のものには有効ですが、攻撃者は常に新しい手口を開発しています。 対策をすり抜ける方法はいくらでも見つかってしまうのです。
2. ホワイトリスト方式:最強の「身元確認」
一方で、「ホワイトリスト方式」は考え方が180度違います。
「招待状を持っている人、あるいは家族以外は一切入れない」というルールにするのです。これなら、泥棒がどんな服を着ていようが、どんな新しい変装をしていようが関係ありません。「リストに載っていない」というだけで、シャットアウトできるからです。
Web開発において、これが「入力値の厳格なバリデーション」です。
---
3. 実践!正規表現で「正解」だけを通す
では、具体的にどう実装すればいいのでしょうか。例えば、「ユーザーID」を受け取る場面を考えてみましょう。
「アルファベットと数字のみ、8文字」というルールがあるなら、それ以外をすべて弾く正規表現を書くのが正解です。
実装例(PHPの例)
ポイントは、「怪しいものを探す」のではなく、「正しいものだけを定義する」ことです。
このコードなら、仮に誰かが 12345678 OR 1=1 といった攻撃コードを投げ込んできても、正規表現の「英数字8文字」という壁に阻まれ、プログラムは即座に停止します。
---
4. なぜこれが「安全な開発」の要なのか
なぜ、多くのエンジニアがホワイトリスト方式を推奨するのか。それは、「守る対象を明確にすれば、守るべき境界線がハッキリするから」です。
ブラックリスト方式は、「何がダメか」を考え続ける終わりのない追いかけっこです。しかし、ホワイトリスト方式は「何が正しいか」を一度決めてしまえば、あとはそのルールを厳守するだけ。開発のコストも、セキュリティの強度も、圧倒的にこちらの方が高いのです。
一歩ずつ対策を学んでいくためのステップ
1. 入力項目ごとに「本来あるべき姿(型、文字種、長さ)」を書き出す。
2. 正規表現を使って、その姿に一致しないものを即座に弾く。
3. 万が一、ルールをすり抜けた場合を想定し、データベース側でも「権限の最小化」を行っておく。
---
最後に:完璧な壁を作る必要はない
最後に少しだけ心構えを。
セキュリティに「100%の安全」はありません。しかし、ホワイトリスト方式を採用することで、あなたのアプリケーションは「隙だらけの玄関」から「鉄壁のセキュリティゲート」へと進化します。
「面倒だな」と思うかもしれませんが、攻撃者があなたのサイトを狙った時、一番最初に諦めさせるのが、この地味なバリデーションなのです。
まずは、今書いているコードの「入力値」を見直すところから始めてみませんか? 一歩ずつ、強固なアプリケーションを作っていきましょう!
コメント