なぜあなたのサイトが「のぞき見」されるのか?XSSIの脅威と鉄壁の守り方
こんにちは!セキュリティの現場で日々、防御の穴を探しているエンジニアです。
今日は、初心者の方が意外と見落としがちな「XSSI(クロスサイトスクリプトインクルージョン)」という攻撃についてお話しします。名前は少し難しそうですが、仕組みはとてもシンプル。「知らないうちに、あなたのサイトの機密情報を泥棒にのぞき見されている状態」のことです。
「うちはパスワードもかけているし大丈夫!」と思っているあなたも、この記事を読み終える頃には、自分のサイトをより強固に守るための「鍵」を手に入れているはずです。一歩ずつ、一緒に学んでいきましょう!
—
そもそも「XSSI」って何だろう?
まずは泥棒の例えで考えてみましょう。
あなたのサイトには、ユーザーの個人情報や取引履歴が書かれた「メモ」があるとします。通常、このメモは「特定の鍵(Cookie)」を持っている人しか見られません。
しかし、もしそのメモが<script>タグという「誰でも拾えるチラシ」のような形で読み込める状態になっていたらどうなるでしょう?攻撃者は悪意のあるサイト(泥棒の隠れ家)を用意し、そこにあなたのサイトのメモを読み込む罠を仕掛けます。
ユーザーが攻撃者のサイトにアクセスした瞬間、ブラウザは「ああ、このユーザーはこのサイトの鍵を持っているな。じゃあ、そのメモを読み込んでもいいよね」と判断し、こっそりあなたのサイトの情報を攻撃者に渡してしまうのです。これがXSSIの恐ろしいところです。
—
防御策その1:Referer(リファラー)チェックで「住所」を確認する
まず最初の防御は、「このリクエストはどこから来たの?」という住所を確認することです。
Webブラウザは、サイトにアクセスする際、必ず「前のページ」の情報をRefererというヘッダーに含めて送信します。これを利用して、「見知らぬ場所からのアクセスなら門前払いする」というルールを作ります。
PHPでの簡単な実装例を見てみましょう。
<?php
// 許可されたドメインのリスト
$allowed_domain = "https://your-safe-site.com";
// リクエスト元のドメインを取得
$referer = $_SERVER['HTTP_REFERER'] ?? '';
// リファラーが正しいかチェック
if (strpos($referer, $allowed_domain) !== 0) {
// 許可されていない場所ならアクセス拒否!
header('HTTP/1.1 403 Forbidden');
exit('アクセス権限がありません');
}
// ここに本来のスクリプト処理を書く
echo "var secretData = '秘密の情報です';";
?>
※注意:Refererはブラウザの仕様や設定で偽装されることもあります。あくまで「最初の関所」として使いましょう。
—
防御策その2:SameSite属性で「鍵」の使い道を制限する
次に、最も強力な武器である「CookieのSameSite属性」について解説します。
Cookieは、いわばあなたのサイトに入るための「合鍵」です。この鍵には、今まで「どこでも使える万能鍵」のような性質がありました。しかし、最近のブラウザではこの鍵に「自分の家以外では使っちゃダメ!」という制限をかけることができます。
それがSameSite属性です。以下の設定をぜひ覚えてください。
設定のポイント
サーバー側でCookieを発行する際、以下のように設定を行います(PHPの例)。
<?php
// Cookieの設定
// SameSite=Lax: リンクをクリックして移動した時は鍵を使うけど、
// 他のサイトから勝手に呼び出された時は鍵を隠す、という設定です。
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => 'your-safe-site.com',
'secure' => true, // HTTPSでのみ通信する
'httponly' => true, // JavaScriptからCookieを盗ませない
'samesite' => 'Lax' // ここが重要!XSSI対策の鍵です
]);
session_start();
?>
Lax: デフォルトで推奨される設定です。外部サイトからの直接的なリクエストではCookieが送られなくなるため、XSSIを防ぐのに非常に効果的です。Strict: さらに厳しく、リンク経由のアクセスであっても外部からのアクセスではCookieを一切送信しません。セキュリティを最優先にするならこちらがベストです。
—
今日からできるセキュリティ習慣
いかがでしたか?「XSSI」という言葉は難しく聞こえても、やっていることは「自分の家の鍵のルールを厳しく決める」という、とても身近なことなんです。
1. 機密情報を返すページにはRefererチェックを入れましょう。
2. Cookieには必ずSameSite=Lax(またはStrict)を設定しましょう。
3. HttpOnly属性も忘れずに。(これでJavaScriptからのCookie盗難も防げます!)
セキュリティは一度やって終わりではなく、日々の積み重ねが大切です。今日紹介したコードは、あなたのサイトを守るための小さな、でも非常に重要な「防犯カメラ」や「強固な鍵」になります。
ぜひ、今のプロジェクトのコードを見直してみてくださいね。これからも一緒に安全なWebサイト作りを楽しんでいきましょう!
コメント