玄関の鍵を壊さず「合鍵」を渡す泥棒を防ぐ:SQLインジェクションとWAFの基礎知識
こんにちは!セキュリティの世界へようこそ。今日は、Webアプリ開発者が避けては通れない「SQLインジェクション」という厄介な攻撃と、それを食い止める「WAF(ワフ)」という門番の役割についてお話しします。
専門用語が並ぶと難しく感じますが、実は身近な「防犯」の仕組みと同じなんですよ。一緒に紐解いていきましょう。
—
1. SQLインジェクションって、何が怖いの?
まずは例え話をしましょう。あなたのWebアプリを「立派な一軒家」だと想像してください。
この家には、郵便受け(入力フォーム)があります。
通常、ユーザーはそこに「名前」や「住所」という、決まった書式の紙を入れますよね。これが正常なやり取りです。
ところが、悪意ある攻撃者は郵便受けに、「この家の権利書をよこせ(データの盗難)」や「この家を爆破しろ(データの破壊)」と書かれた特殊な命令文を投げ込みます。
これが「SQLインジェクション」です。
Webアプリがその命令を「ただの入力データ」だと思って実行してしまった瞬間、あなたの家の中に入り込まれ、勝手に金庫を開けられてしまうのです。
—
2. WAF(門番)はどうやって泥棒を見抜くのか?
この泥棒を入り口で食い止めるのがWAF(Web Application Firewall)です。
WAFは、郵便受けに入れられた手紙を片っ端から検閲する「凄腕の警備員」です。
「シグネチャ」という指名手配書
WAFは「シグネチャ」という指名手配リストを持っています。
UNION:別の家の情報を混ぜて盗もうとする手口SELECT:勝手に棚の中身を覗き見る行為DROP:家を壊そうとする危険なサイン
これらのキーワードが手紙の中に含まれていたら、「怪しい!」と判断して門前払い(ブロック)します。
—
3. 泥棒の「偽装工作」をどう見破る?(正規化の重要性)
泥棒もバカではありません。そのまま「DROP」と書いたら見つかることを知っています。
そこで、文字を少し変形させてごまかします。
- URLエンコード:
%53%45%4c%45%43%54(実はSELECTのこと) - 大文字小文字の混在:
sElEcT - コメント挟み込み:
SEL//ECT
これでは、単純なパターンマッチング(文字の一致確認)では見逃してしまいます。そこで必要なのが「正規化(Normalization)」です。
正規化とは、「汚れた手紙を一度洗濯して、本来の姿に戻すこと」です。
WAFは、バラバラにされた命令を元通りのきれいな文字列に直してから、「指名手配リスト(シグネチャ)」と照らし合わせます。そうすることで、どんなに隠蔽工作をされても、泥棒の正体を見破ることができるのです。
—
4. 実践:WAFのシグネチャ設定を覗いてみる
実際にWAFで設定するシグネチャのイメージをコードで見てみましょう。
シンプルなSQLインジェクション検知用正規表現の例
1. 郵便受けから来たデータを「小文字」に変換する(正規化)
2. 以下のパターンにマッチしたらブロックする
(?i)(union|select|drop|insert|delete|update).(–|#|\/\)
解説:
(?i) : 大文字小文字を区別しない設定
(union|…) : このいずれかのキーワードがあれば怪しい!
. : 何らかの文字が続き
(–|#|\/\) : SQLのコメント記号(命令の続きを無効化する小細工)があればアウト!
もちろん、これだけでは「正常な文章(例:ブログのタイトルに”SELECT”という言葉を使う)」までブロックしてしまう可能性があります。これを「誤検知(False Positive)」と呼びます。
—
5. 誤検知を減らすための「賢い防犯」
セキュリティをガチガチに固めすぎて、お客さんまで追い返してしまっては本末転倒ですよね。誤検知を減らすには、以下のステップが重要です。
1. まずは「ログモード」で動かす: いきなりブロックせず、怪しい動きがあったら記録だけ残す期間を設けます。
2. 正常なアクセスを学習させる: 「このページでは『SELECT』という単語はよく使われる」といったルールを例外として設定します。
3. 根本対策を優先する: WAFはあくまで「最後の砦」です。一番大切なのは、プログラム側で「プリペアドステートメント(SQLの命令文とデータを分離する技術)」を使うこと。これができれば、そもそもSQLインジェクションという攻撃自体が成立しなくなります。
—
最後に:セキュリティは「泥臭い積み重ね」
セキュリティの世界に、魔法のような一発解決策はありません。
「どんな泥棒が来そうか?」を考え、手紙(ログ)を読み込み、警備員(WAF)の設定を少しずつ調整していく……そんな泥臭い作業の積み重ねが、サービスの信頼を守ります。
まずは、「自分のWebアプリの入り口には、どんな手紙が届いているのか?」をログで確認することから始めてみませんか?それが、一流のエンジニアへの第一歩です。
何か分からないことがあれば、いつでもまた聞きに来てくださいね!一緒に安全なWebの世界を作っていきましょう。
コメント