【入門編】DOMPurifyを用いたクライアントサイドサニタイズの実装 – アプリケーションセキュリティ & 安全な開発防御ガイド

玄関の鍵を閉めても「泥棒」はやってくる?DOM型XSSからWebサイトを守る「最強の防犯術」

こんにちは!セキュリティの世界へようこそ。
普段、家の玄関にはしっかり鍵をかけていますよね?でも、もし「家の中に誰かが紛れ込んでいて、家主のフリをして勝手に家具を並べ替えていたら」どうでしょう。

実は、Web開発の世界で「XSS(クロスサイトスクリプティング)」と呼ばれる攻撃は、まさにこれと同じことを引き起こします。今回は、特に厄介な「DOM型XSS」の仕組みと、それを完璧に防ぐための魔法のツール「DOMPurify」について、一緒に紐解いていきましょう。

—

そもそも「XSS」ってどんな泥棒?

WebサイトにおけるXSS攻撃を、身近な例で考えてみましょう。

  • 反射型・格納型XSS: 郵便受けに爆弾入りの手紙を投げ込まれるようなものです。サーバー側で処理をミスすると、サイト自体が攻撃の踏み台にされます。
  • DOM型XSS: 泥棒が「あなたの家の鍵」をすり替え、家の中の動線(DOM)を勝手に書き換えるような攻撃です。サーバーには全く関与せず、あなたのブラウザの中だけで完結してしまうため、非常に気づきにくいのが特徴です。

最近のWebアプリは、JavaScriptを使って画面を動的に書き換えることが増えています。このとき、「ユーザーが入力した文字を、そのまま画面のHTMLとして反映してしまう」というコードを書くと、そこが泥棒の入り口になってしまうんです。

—

防御の要「DOMPurify」を使おう

「じゃあ、ユーザーからの入力を全部禁止すればいいの?」というと、そうはいきませんよね。プロフィール欄やコメント欄など、リッチな表現が必要な場面は多いはずです。

そこで登場するのがDOMPurifyです。これは、HTMLの中から「危ないスクリプト(泥棒の道具)」だけを綺麗に洗い流し、安全な部分だけをDOMに書き込むための「最強の門番」です。

DOMPurifyの基本的な実装

まずは、npm経由でインストールして、実際に使ってみましょう。

// ライブラリを読み込みます
import DOMPurify from ‘dompurify’;

// ユーザーが入力した怪しいHTML文字列
const dirtyInput = ‘こんにちは!’;

// DOMPurifyが「onerror」のような悪意ある属性だけを削除してくれます
const cleanHTML = DOMPurify.sanitize(dirtyInput);

// 安全になったHTMLだけをDOMに挿入!
document.getElementById(‘content’).innerHTML = cleanHTML;

これだけで、onerrorという「泥棒が忍び込むための仕掛け」が取り除かれ、安全なタグだけが残ります。簡単ですよね?

—

「ホワイトリスト」で完璧な要塞を作る

DOMPurifyの凄さは、「何を許可するか(ホワイトリスト)」を細かく設定できる点にあります。「画像はいいけど、リンクは許可したい」「スタイル(CSS)は一切禁止したい」といった、きめ細やかなルール設定が可能です。

const cleanHTML = DOMPurify.sanitize(dirtyInput, {
ALLOWED_TAGS: [‘b’, ‘i’, ‘em’, ‘strong’, ‘a’], // 許可するタグはこれだけ!
ALLOWED_ATTR: [‘href’], // 許可する属性はリンク先だけ!
FORBID_TAGS: [‘style’, ‘script’], // これらは問答無用で拒否!
FORBID_ATTR: [‘onerror’, ‘onload’], // 悪意ある属性は徹底ブロック
});

このように、許可するもの以外をすべて遮断する「ポジティブ・セキュリティモデル」を採用することで、未知の攻撃に対しても高い防御力を維持できます。

—

現場のエンジニアが教える「さらなる防衛」

DOMPurifyはあくまでクライアントサイドの防護壁ですが、さらに守りを固めるために「CSP(コンテンツセキュリティポリシー)」という防犯カメラを併用しましょう。

CSPは、Webサーバーからブラウザに向けて「このサイトでは、外部のスクリプトを勝手に実行させないでね!」と命令を出すヘッダー情報のことです。

Content-Security-Policy: default-src ‘self’; script-src ‘self’;

このように設定しておけば、万が一DOMPurifyをすり抜けるような攻撃コードが残っていたとしても、ブラウザ側が「怪しいコードは実行しません!」と門前払いしてくれます。

—

最後に:セキュリティは「継続」が全て

今回お伝えした「DOMPurifyでのサニタイズ」と「CSPの設定」は、現代のWeb開発において必須の教養です。セキュリティ対策は、一度やって終わりではありません。

  • ユーザーの入力は「常に怪しいもの」として扱うこと
  • 信頼できるライブラリを活用して、車輪の再発明をしないこと
  • 常に最新の脅威トレンドに目を向けること

これらを意識するだけで、あなたの書くコードはぐっと堅牢になります。まずは小さな一歩から、安全なWebの世界を一緒に作っていきましょう!

もし実装で悩んだら、いつでもこの「セキュリティバイブル」を読み返してくださいね。皆さんの開発ライフが、安全で楽しいものになることを心から応援しています。

コメント

タイトルとURLをコピーしました