玄関の鍵、開けっ放しにしていませんか?Vue.jsの v-html が引き起こす「見えない泥棒」の話
こんにちは。セキュリティの世界で「盾」を握り続けているエンジニアです。
今日は、Vue.jsというモダンで便利なフレームワークを使っている開発者なら、必ず一度は目にするであろう「v-html」という魔法の呪文についてお話しします。
便利すぎてついつい使ってしまいがちなこの機能。実は、一歩間違えると「泥棒を家の中に招き入れる招待状」になりかねない、非常に危険な側面を持っているんです。「まさか自分のコードが狙われるはずがない」と思っているあなたこそ、ぜひ最後まで読んでくださいね。
—
1. v-html とは?:便利な道具は、時に凶器になる
Vue.jsには、HTMLタグをそのままブラウザに描画させるための v-html というディレクティブがあります。
これを使うと、例えばCMSのように「太字」や「リンク」をユーザーに許可したい場合にとても便利ですよね。でも、ここがセキュリティの最大の盲点です。
家に例えるなら…
v-html を使うということは、玄関の扉を「誰でも好きなものを置いていいですよ」と全開にするようなものです。もし、悪意ある人がそこから「爆発物(悪意あるスクリプト)」を置いていったらどうなるでしょうか? それが「クロスサイトスクリプティング(XSS)」の正体です。
—
2. なぜ v-html は危険なのか?
ブラウザは、HTMLの中に タグを見つけると、「あ、これはプログラムだな。実行しなきゃ!」と素直に命令を聞いてしまいます。
攻撃者は、あなたのサイトのコメント欄やプロフィール欄に、以下のようなメッセージを書き込みます。
このコードが v-html で読み込まれた瞬間、被害者のブラウザ上で攻撃者のプログラムが勝手に動き出します。クッキー(ログイン情報)を盗んだり、勝手にパスワード変更画面へ誘導したりと、やりたい放題です。
---
3. 「見えない泥棒」を防ぐための鉄則
「じゃあ、HTMLを表示させたいときはどうすればいいの?」と不安になりますよね。大丈夫、一歩ずつ対策を学んでいきましょう。
対策その①:そもそも「HTML」を許可しない
最も安全なのは、ユーザーの入力を「テキスト」として扱うことです。Vue.jsのテンプレート構文 {{ }} を使えば、Vueは自動的にHTMLタグを無害化(エスケープ)して表示してくれます。
対策その②:どうしてもHTMLが必要なら「サニタイズ」する
「どうしてもリッチテキストを表示したい!」という場合は、v-html に渡す前に、「危険なタグだけを掃除する」必要があります。これを「サニタイズ(消毒)」と呼びます。
信頼できるライブラリ、例えば DOMPurify を使うのが業界のスタンダードです。
import DOMPurify from 'dompurify';
// ユーザー入力を受け取ったら、表示する前に必ず「消毒」する!
const cleanHTML = DOMPurify.sanitize(userInput);
// 消毒済みのデータのみを v-html に渡す
// これで、悪いスクリプトは取り除かれます
---
4. 最後に:セキュリティは「疑うこと」から始まる
セキュリティエンジニアとして、多くの現場を見てきましたが、インシデントを起こすのは「悪意ある攻撃者」だけではありません。「自分は大丈夫」という思い込みが、一番の脆弱性になります。
- 「自分のコードは大丈夫か?」と常に疑うこと。
- 「受け取ったデータは全て毒だ」と仮定して扱うこと。
この二つを意識するだけで、あなたの書くコードは格段に強固になります。
Vue.jsは素晴らしい技術です。でも、その便利さに溺れず、正しい知識という「鍵」をしっかりかけて、安全なWeb体験をユーザーに届けてあげてくださいね。
皆さんの開発ライフが、今日も安全でありますように!もし分からないことがあれば、いつでもまた聞きに来てくださいね。一歩ずつ、一緒に強くなっていきましょう。
コメント