
目次
こんにちは、マサシです。
サイトの乗っ取りというと、「そのページが書き換えられる」ことを想像する方が多いと思います。
実際には、表示のさせ方しだいで、被害が1ページで終わらないことがあります。
私自身、以前はその原因になる書き方を、何も考えずに使っていました。
先に結論:表示のさせ方1つで、被害の範囲が変わる
外部から取ってきた文字列を、そのままページの中に差し込む書き方をしていると、被害が1か所で終わらなくなることがあります。
見出しや説明文といった「ただの文字」に見えるものでも、書き方によってはブラウザに命令として読み込まれてしまうからです。
この記事では、確認したい3ステップと、私自身がやめた書き方をまとめます。
どんな仕組みで起きるか
サイトの一部のページには、別のページの情報を持ってきて表示する機能がついていることがあります。
新着情報の一覧や、関連記事の紹介などがその例です。
この「持ってきた情報」を画面に入れるとき、文字列をそのままつなげて差し込む書き方があります。
見出し・リンク先・画像のURLといった項目を、余計な記号や命令を取り除かずに入れてしまう書き方です。
普段は見た目が正しく表示されるので、この差し込み方が問題だとは気づきにくいです。
問題になるのは、差し込む文字列の中に、たまたま余計な記号が混ざったときだけです。
普段のお知らせや記事タイトルには、そういった記号はまず出てきません。
だからこそ、公開してから長い期間、誰も気づかないまま動いていることがあります。
似ているようで違う、2つの書き方
同じ「文字を画面に表示する」作業でも、やり方は大きく2つに分かれます。
1つは、受け取った文字列をそのまま画面の枠に差し込む書き方です。
もう1つは、文字列を「ただの文字」として扱い、命令として読み込まれないようにしてから表示する書き方です。
見た目はどちらも同じ画面になります。
違うのは、文字列の中に余計な記号が混ざっていたときの動きだけです。
前者は記号を命令として実行してしまい、後者はただの文字として無視します。
制作会社に確認するときは、この2つのどちらを使っているかを聞けば十分です。
なぜ危ないのか
「見出しをそのまま表示するだけ」なら、普段は何も起こりません。
危ないのは、その見出しを書き込める人が、想定より多い場合です。
投稿の権限を持つ人が増えるほど、見出しの中に余計な命令を混ぜられる可能性が増えます。
混ぜられた命令は、ブラウザ側でそのまま読み込まれて動きます。
表示していたページが、たまたま別の機能(購入・ログインなど)と同じサイトの中にあると、被害はその1ページだけで終わりません。
これは、IPA(情報処理推進機構)が公式サイト「安全なウェブサイトの作り方」(https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html)で、長年注意を呼びかけているクロスサイト・スクリプティングという種類の問題です。
専門的な名前を覚える必要はありません。
覚えておきたいのは、「表示のさせ方によって、被害の範囲が変わる」という1点です。
サイトの中にある機能は、たいてい同じドメインの中でつながっています。
お知らせを表示する場所と、問い合わせフォームや購入ページが、見た目では別々でも、裏側では同じ土台の上に乗っていることが多いです。
土台が同じということは、1つの入り口から入られると、他の機能にも同じ入られ方が効いてしまうということです。
だからこそ、被害を「その1ページだけ」と決めつけずに、他にどこまで同じ書き方があるかを数えることが大切になります。
確認したい3ステップ
自分のサイトに同じ危険がないか、次の3ステップで見ていきます。
どれも画面を見て回るか、担当者に1つ質問するだけなので、3つ合わせて10分ほどで終わります。
- サイトの中に、他のページの文字列をそのまま表示する機能がないか探す(新着一覧・関連記事・レビュー表示など)
- その機能が、投稿や更新の権限を持つ人以外にも書き込みを許していないか確認する
- 表示のしかたが、そのまま画面に差し込む書き方か、安全に組み立てる書き方かを、担当の制作会社や担当者に聞く
1つ目は、サイトの中を見て回るだけの作業です。
新着情報・お客様の声・関連記事の紹介など、「他の場所の文字が出てくる場所」を数えてみてください。
2つ目は、更新の担当者が何人いるかを数える作業です。
担当者以外の誰かが書き込める入り口(会員投稿・コメント欄・問い合わせの内容がそのまま表示される仕組みなど)がないかも合わせて見ておくと安心です。
3つ目は、自分で調べようとしなくてかまいません。
3ステップとも、専門知識がなくても質問として使えます。
聞いた答えが「わからない」であれば、それ自体が確認すべき合図です。
「うちは大丈夫」と思っていた理由
この話をすると、「小さいサイトだから狙われない」と考える方がいます。
狙われるかどうかと、被害が広がるかどうかは、別の話です。
狙われる確率は規模で変わるかもしれませんが、書き込む権限を持つ人が1人でも増えれば、その人の入り口はそのまま残ります。
担当者を増やしたり、外部のライターに投稿を頼んだりするタイミングで、この確認を忘れがちです。
新しく人を増やしたときこそ、表示のしかたを見直すよい機会になります。
私がやめたこと
この書き方を最初にしていたのは、実は私自身でした。
以前は、別のページの情報をそのまま表示する機能を、深く考えずにこの方法で組んでいました。
そのときは「文字を表示するだけだから」と思っていました。
見た目さえ正しければ問題ないと考えていて、差し込み先の記号までは気にしていませんでした。
気づいたきっかけは、「もし投稿の権限を奪われたら、被害はどこまで届くか」を自分で数え直したことです。
数えてみると、差し込み先は1ページで終わらず、同じ土台の上にある他の機能にも届く書き方になっていました。
今は、外部から来る文字列を画面に入れるときは、テキストとして扱う書き方に統一しています。
命令として読み込まれる余地を、最初から作らないようにしました。
新しく機能を作るときも、「この文字列は、どこから来た文字列か」を最初に確認する手順に変えています。
まとめ:見た目が同じでも、作り方は違う
同じ「見出しを表示する」機能でも、作り方によって危険度は変わります。
見た目だけを確認しても、この違いには気づけません。
自分のサイトに他のページの情報を表示する機能があるなら、まずは先の3ステップで確認してみてください。
わからないところがあれば、担当の制作会社に聞くだけでも十分な一歩になります。
一度確認して直しておけば、同じ質問を繰り返す必要はありません。
サイトを新しく作るときも、リニューアルするときも、この3ステップは着手の早い段階で聞いておくと安心です。
見た目のデザインや文章と同じくらい、表示のしかたも、サイトの土台を決める要素の1つだと考えています。
自分でやるのが不安なときは
サイトが急に動かなくなって、自分で直すのが不安な方へ。
この記事で書いた作業は、Mstudioでもお受けしています。
見積りの相談だけでも大丈夫です。

