3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZOZOAdvent Calendar 2024

Day 4

DOMPurifyを使ったsanitizeの実装を簡単にまとめてみた

Posted at

この記事はZOZO Advent Calendar 2024 シリーズ7の4日目の記事です。

はじめに

先日初めてDOMPurifyを用いたサニタイズの実装をしました
せっかくなので今回はそれについて簡単にまとめようと思います

サニタイズとは

サニタイズとは、ユーザーが入力したデータや外部から取得したデータを表示する際、不正なスクリプトや危険な文字列を無害化する処理を指します
特にフロントエンドではクロスサイトスクリプティング(XSS)などのセキュリティリスクを防ぐ目的で実装されたりします

DOMPurify

DOMPurifyとは

DOMPurifyとはHTMLやSVGなどのコンテンツをサニタイズするために使用されるJavaScriptライブラリです

非常に高速なサニタイズを提供し、大量のデータを処理する際にも優れたパフォーマンスを発揮するため、数あるサニタイズライブラリの中でも高い人気を誇っています

使い方

今回はReactで使用する例を紹介したいと思います

1. ライブラリのインストールします(今回はnpm経由)

npm install dompurify

2. インストールしたDOMPurifyをインポートしDOMPurifyのsanitize関数にサニタイズしたいHTMLを渡す

import DOMPurify from 'dompurify';

const clean = DOMPurify.sanitize('<b>hello there</b>');

以上で基本的なサニタイズは実現できます

実例

今回は以下のようなHTMLを元に実例を見ていきたいと思います

`<div style="color: red;"><p>サニタイズデモ</p><script>alert('scriptタグを用いたXSS');</script></div>`

以下のようなコードでサニタイズなしで表示するとscriptタグなどもそのまま埋め込まれているのが確認できます

function App() {
  // サニタイズ前のHTML
  const html = `<div style="color: red;"><p>サニタイズデモ</p><script>alert('scriptタグを用いたXSS');</script></div>`;

  return (
    <>
      <div dangerouslySetInnerHTML={{ __html: html }} />
    </>
  );
}

スクリーンショット 2024-12-04 3.30.05.png

これでは悪意のあるスクリプトが入っていた際に、情報漏洩などのリスクを伴ってしまいます
そこでDOMPurifyを用いてサニタイズを実装してみます

すると、scriptタグが切り取られているのが確認できると思います

function App() {
  // サニタイズ前のHTML
  const html = `<div style="color: red;"><p>サニタイズデモ</p><script>alert('scriptタグを用いたXSS');</script></div>`;

  // サニタイズ後のHTML
  const cleanHTML = DOMPurify.sanitize(html);

  return (
    <>
      <div dangerouslySetInnerHTML={{ __html: cleanHTML }} />
    </>
  );
}

スクリーンショット 2024-12-04 3.34.49.png

ちなみに、sanitize関数の第二引数にて細かい設定を追加することもできます
以下ではstyle属性も取り除くように設定を追加し、実際に取り除かれているのが確認できます

const cleanHTML = DOMPurify.sanitize(html, { FORBID_ATTR: ["style"] });

スクリーンショット 2024-12-04 3.38.57.png

他にもDOMPurifyのリポジトリのREADMEに設定回りついても書いてあるので興味ある方は覗いてみてください

おわり

今回はDOMPurifyを用いたサニタイズの実装について簡単にまとめてみました
引き続きDOMPurifyやセキュリティ周りついての知見を増やし、機会があればアウトプットもしていきたいと思います!

内容やソースコードに間違い等ありましたらご指摘いただけますと学びになり大変幸いです。
ここまで読んでいただきましてありがとうございました!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?