こんにちは!セキュリティの世界へようこそ。
今日は、開発者がつい見落としがちなのに、攻撃者からは「お宝の山」に見えてしまう脆弱性、「IDOR(アイドア:安全でない直接オブジェクト参照)」についてお話しします。
難しそうな名前ですが、仕組みを知れば「えっ、そんな単純なことで防げるの?」と驚くはずです。一緒に紐解いていきましょう!
—
1. IDORって、そもそも何?
IDORを身近な例で説明しますね。
想像してみてください。あなたは、自分専用の「鍵付きのロッカー」を借りているとします。ロッカーには「101番」という番号が振られていました。
ある日、あなたはふと思いつきます。
「もし、この101という番号を102に変えたら、隣の人のロッカーが開いちゃうんじゃない?」
実際にやってみたら、鍵屋さんもびっくり、隣のロッカーがガチャリと開いてしまいました。これがIDORです。
「自分専用だと思っていたデータが、番号(ID)を書き換えるだけで他人のものまで見えてしまう」という、致命的な管理ミスを指します。
2. なぜこんなことが起きるの?(攻撃のメカニズム)
Webサイトでは、ユーザーの情報を取得するために、よくこのようなURLが使われます。
https://example.com/user/profile?id=1001
開発者としては「1001番のユーザー情報を表示する」という意図でこのURLを作ります。しかし、悪意のある攻撃者は、この id=1001 という部分に注目します。
もし、ブラウザのURL欄で id=1001 を id=1002 に書き換えてエンターキーを押したらどうなるでしょうか?
システムが「1002番の情報を返せ!」という命令を疑いもせず実行してしまったら、他人の個人情報がダダ漏れになってしまいます。
脆弱なプログラムの例(PHP)
例えば、バックエンドでこんな風に書いていたら要注意です。
// 危険な実装例
$user_id = $_GET['id']; // URLのパラメータをそのまま受け取る
$sql = "SELECT * FROM users WHERE id = " . $user_id;
$result = $db->query($sql); // IDさえ分かれば誰のデータでも引けてしまう
これでは、「誰がログインしているか」なんて関係ありません。IDさえ知っていれば、世界中のデータにアクセスできてしまう「ザル」のような状態なのです。
—
3. 「鍵」をもう一度チェックしよう(対策の基本)
では、どうやって防げばいいのでしょうか?
答えは簡単。「そのIDをリクエストした人が、本当にそのデータにアクセスする権利を持っているか」を毎回チェックすることです。
家の例で言えば、「番号が合っているか」ではなく、「その人はこのロッカーの持ち主(の鍵を持っている人)か」を確認するということですね。
対策したプログラム例
セッション情報(ログイン中のユーザーID)と、リクエストされたIDを照らし合わせるのが鉄則です。
// 安全な実装例
session_start();
$my_id = $_SESSION['user_id']; // 現在ログイン中のユーザーID
$requested_id = $_GET['id']; // アクセスしようとしているID
// 自分のIDとリクエストされたIDが一致するかチェック!
if ($my_id == $requested_id) {
// 一致していればデータを表示
$sql = "SELECT * FROM users WHERE id = " . $my_id;
// ...実行処理...
} else {
// 一致しなければエラー、またはアクセス拒否
die("不正なアクセスです!");
}
—
4. 現場で使える「もう一つの防衛術」
プログラムでのチェックに加えて、「予測困難なIDを使う」というテクニックも有効です。
連番(1, 2, 3…)を使っていると、攻撃者に「次は4番だ!」と推測されてしまいます。そこで、1001 のような単純な数字ではなく、a1b2-c3d4-e5f6 のようなUUID(ランダムな文字列)をIDとして使ってみましょう。
推測できないIDであれば、攻撃者は「どのIDを入力すれば他人のデータが見られるか」を特定するのが非常に困難になります。
—
最後に:セキュリティは「性悪説」で考えよう
IDORを防ぐコツは、「フロントエンドから送られてきたデータは、全て疑ってかかること」です。
画面上の表示を隠したからといって、データまで隠れているわけではありません。バックエンドのサーバー側で「この人は本当にこれを操作していい人か?」という関所を必ず設けるようにしましょう。
最初は面倒に感じるかもしれませんが、一度この「チェックの習慣」を身につければ、あなたの作るサービスはグッと堅牢になります。
今日の学びが、あなたの開発ライフの小さな「鍵」になれば嬉しいです。これからも一緒に、安全で楽しいWebの世界を作っていきましょうね!
コメント