htmlサニタイザーとは
サニタイズとは、主にHTMLやJavaScriptなどでWebサイトの表示や機能を記述するために用いられる特殊文字を、単純な文字として扱いたい場合に行われる。
なぜサニタイズをする必要があるかというと、Webサイトに設置された入力フォームなどから、悪意のあるスクリプトコードが入力されると、その文字列が解釈・実行されることで様々な被害に遭う恐れがあるためである。
想定している読者のニーズ
- ユーザーが自由に使えるオンラインエディタでhtml5の任意のタグを使えるようにしたい
- html5に対応したrubyのサニタイザーを比較したい
想定してないニーズ
- html4以前のサニタイズでいいや → tidyっていうgemがサニタイズもフォーマットもしてくれるのでおすすめ
*ただし10年ほどメンテされていないので、そこは注意が必要
TL;DR
個人としては、sanitizeかloofahの2択だと思っている。
見た感じ、どちらを選択してもメリット・デメリットは同じくらいな気がする。とはいえreadmeにカスタマイズの方法が書いてあるsanitizeのほうがイニシャルコストもかからないし、わかりやすいと思う。
規模が小さいサニタイザーでいいならそれぞれのタグやらcssやらの許可の運用コストは問題にならないが、規模が大きくなってくるとそれなりに面倒かも。
sanitize https://github.com/rgrove/sanitize
検討項目 | 評価 | 備考 |
---|---|---|
<機能面> | ||
railsを使わないで導入できるか | ⚪ | 下記依存gemを参照 |
html5に対応しているか | ⚪ | html5に対応しており、data-属性もカスタマイズで対応可能。 |
フィルターをカスタマイズできるか | ⚪ |
https://github.com/rgrove/sanitize#configuration ホワイトリスト方式 <カスタム> HTML fragments → htmlからcssまでサニタイズできる HTML document → htmlのみサニタイズできる <コンフィグ> ・タグ ・属性 ・プロトコル ・css ・htmlコメントの許可 ・doctype宣言の許可 ・解析オプションの設定https://github.com/rubys/nokogumbo/tree/master#parsing-options ・設定したコンテンツの削除設定(remove_contents) ・さらに踏み込んだカスタム設定https://github.com/rgrove/sanitize#transformers <設定> ・restricted(b em i strong u タグのみ許可、属性やcssは通さない) ・basic(限定的なタグ、属性のみ許可、cssは通さない) ・relaxed(かなり緩め、cssも通す) ・custom(自分たちで設定できる) |
壊れていたり、悪意のあるマークアップは修正するか | ⚪ | 参考:https://github.com/rgrove/sanitize/blob/main/COMPARISON.md |
解析アルゴリズムはhtml5に準拠しているか | ⚪ | ブラウザ/html5に準拠したhttps://github.com/google/gumbo-parser を使っている |
<gemの概要> | ||
商用利用可能なライセンスか | ⚪ |
https://github.com/rgrove/sanitize/blob/main/LICENSE MIT License |
ドキュメントは充実しているか | △ | https://github.com/rgrove/sanitize/blob/main/README.md |
保守されているか | ⚪ |
https://github.com/rgrove/sanitize/releases/tag/v6.0.0 最新版は2021年8月4日 |
スター数/DL数 | ⚪ | 1.9k / 48,925k (2022年4月27日現在) |
依存しているgemは何か | ⚪ | crass, nokogiri, minitest, rake 参考:https://rubygems.org/gems/sanitize |
loofah https://github.com/flavorjones/loofah
検討項目 | 評価 | 備考 |
---|---|---|
<機能面> | ||
railsを使わないで導入できるか | ⚪ | 下記依存gemを参照 |
html5に対応しているか | ⚪ |
https://github.com/flavorjones/loofah/blob/main/lib/loofah/html5/safelist.rb おそらくhtml5に対応していると思う |
フィルターをカスタマイズできるか | ⚪ |
https://github.com/flavorjones/loofah#compare-and-contrast いちおうcustomできるらしい。 カスタマイズするためのドキュメントは存在しないので、issue投げたり、自力で調べる必要がありそう。 |
壊れていたり、悪意のあるマークアップは修正するか | ⚪ | 参考:https://github.com/rgrove/sanitize/blob/main/COMPARISON.md |
解析アルゴリズムはhtml5に準拠しているか | △ | libxml2というhtml5非準拠のパーサーを使っている |
<gemの概要> | ||
商用利用可能なライセンスか | ⚪ |
https://github.com/flavorjones/loofah/blob/main/MIT-LICENSE.txt MIT License |
ドキュメントは充実しているか | △ | https://github.com/flavorjones/loofah/blob/main/README.md |
保守されているか | ⚪ |
https://github.com/flavorjones/loofah/releases/tag/v2.18.0 最新版は2022年5月11日 |
スター数/DL数 | ⚪ | 846 / 289,940k(2022年4月27日現在) |
依存しているgemは何か | ⚪ | crass, nokogiri, hoe-markdown, json, minitest, rake, rdoc, rr, rubocop 参考:https://rubygems.org/gems/loofah |
rails-html-sanitizer https://github.com/rails/rails-html-sanitizer
検討項目 | 評価 | 備考 |
---|---|---|
<機能面> | ||
railsを使わないで導入できるか | ☓ | railsの上で動かすloofah、依存gemは下記参照 |
html5に対応しているか | - | loofahと同様 |
フィルターをカスタマイズできるか | - | loofahと同様 |
壊れていたり、悪意のあるマークアップは修正するか | - | loofahと同様 |
解析アルゴリズムはhtml5に準拠しているか | - | loofahと同様 |
<gemの概要> | ||
商用利用可能なライセンスか | ⚪ |
https://github.com/rails/rails-html-sanitizer/blob/master/MIT-LICENSE MIT License |
ドキュメントは充実しているか | △ | https://github.com/rails/rails-html-sanitizer/blob/master/README.md |
保守されているか | ⚪ |
https://github.com/rails/rails-html-sanitizer/releases/tag/v1.4.3 最新版は2022年6月9日 |
スター数/DL数 | ⚪ | 248 / 270,234k(2022年4月27日現在) |
依存しているgemは何か | ☓ | loofah, bundler, minitest, rails-dom-testing, rake 参考:https://rubygems.org/gems/rails-html-sanitizer |
htmlfilter https://github.com/rubyworks/htmlfilter
検討項目 | 評価 | 備考 |
---|---|---|
<機能面> | ||
railsを使わないで導入できるか | ⚪ | 下記依存gemを参照 |
html5に対応しているか | ☓ | html5に対応していないために、以下の検討は不要だと判断した。 |
フィルターをカスタマイズできるか | - | |
壊れていたり、悪意のあるマークアップは修正するか | - | |
解析アルゴリズムはhtml5に準拠しているか | - | |
<gemの概要> | ||
商用利用可能なライセンスか | ⚪ |
https://github.com/rubyworks/htmlfilter/blob/master/LICENSE.txt BSD-2-Clause |
ドキュメントは充実しているか | ☓ | https://github.com/rubyworks/htmlfilter/blob/master/README.md |
保守されているか | ☓ |
https://github.com/rubyworks/htmlfilter/releases/tag/1.1 最新版は2009年11月25日 |
スター数/DL数 | △ | 8 / 22k(2022年4月27日現在) |
依存しているgemは何か | ⚪ | ae, detroit, microtest 参考:https://rubygems.org/gems/htmlfilter |