Rubyでのhtmlサニタイザーの検討

## htmlサニタイザーとは
サニタイズとは、主にHTMLやJavaScriptなどでWebサイトの表示や機能を記述するために用いられる特殊文字を、単純な文字として扱いたい場合に行われる。<br>
なぜサニタイズをする必要があるかというと、Webサイトに設置された入力フォームなどから、悪意のあるスクリプトコードが入力されると、その文字列が解釈・実行されることで様々な被害に遭う恐れがあるためである。


## 想定している読者のニーズ
- ユーザーが自由に使えるオンラインエディタでhtml5の任意のタグを使えるようにしたい
- html5に対応したrubyのサニタイザーを比較したい



## 想定してないニーズ
- html4以前のサニタイズでいいや → [tidyっていうgemがサニタイズもフォーマットもしてくれるのでおすすめ](https://rubygems.org/gems/tidy/versions/1.1.2)
*ただし10年ほどメンテされていないので、そこは注意が必要

- railsを使用しているプロジェクト
railsの基本ライブラリにsanitizerがあるのでそれをつかえばい


## 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<br>ホワイトリスト方式<br><カスタム><br>HTML fragments → htmlからcssまでサニタイズできる<br>HTML document → htmlのみサニタイズできる<br><コンフィグ><br>・タグ<br>・属性<br>・プロトコル<br>・css<br>・htmlコメントの許可<br>・doctype宣言の許可<br>・解析オプションの設定https://github.com/rubys/nokogumbo/tree/master#parsing-options<br>・設定したコンテンツの削除設定（remove_contents）<br>・さらに踏み込んだカスタム設定https://github.com/rgrove/sanitize#transformers<br><設定><br>・restricted(b em i strong u タグのみ許可、属性やcssは通さない)<br>・basic（限定的なタグ、属性のみ許可、cssは通さない）<br>・relaxed（かなり緩め、cssも通す）<br>・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<br>MIT License |
| ドキュメントは充実しているか| △ |https://github.com/rgrove/sanitize/blob/main/README.md|
|保守されているか |⚪ | https://github.com/rgrove/sanitize/releases/tag/v6.0.0<br>最新版は2021年8月4日|
|スター数/DL数|⚪|1.9k / 48,925k （2022年4月27日現在）
| 依存しているgemは何か| ⚪ |crass, nokogiri, minitest, rake<br>参考：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<br>おそらくhtml5に対応していると思う|
| フィルターをカスタマイズできるか| ⚪|https://github.com/flavorjones/loofah#compare-and-contrast<br>いちおうcustomできるらしい。<br>カスタマイズするためのドキュメントは存在しないので、issue投げたり、自力で調べる必要がありそう。|
|壊れていたり、悪意のあるマークアップは修正するか|⚪|参考：https://github.com/rgrove/sanitize/blob/main/COMPARISON.md|
|解析アルゴリズムはhtml5に準拠しているか|△|libxml2というhtml5非準拠のパーサーを使っている|
|＜gemの概要＞| | |
|商用利用可能なライセンスか|⚪|https://github.com/flavorjones/loofah/blob/main/MIT-LICENSE.txt<br>MIT License|
|ドキュメントは充実しているか|△|https://github.com/flavorjones/loofah/blob/main/README.md|
|保守されているか|⚪|https://github.com/flavorjones/loofah/releases/tag/v2.18.0<br>最新版は2022年5月11日|
|スター数/DL数|⚪|846 / 289,940k（2022年4月27日現在）|
|依存しているgemは何か|⚪|crass, nokogiri, hoe-markdown, json, minitest, rake, rdoc, rr, rubocop<br>参考：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<br>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<br>最新版は2022年6月9日|
|スター数/DL数|⚪|248 / 270,234k（2022年4月27日現在）|
|依存しているgemは何か|☓|loofah, bundler, minitest, rails-dom-testing, rake<br>参考：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<br>BSD-2-Clause|
|ドキュメントは充実しているか|☓|https://github.com/rubyworks/htmlfilter/blob/master/README.md|
|保守されているか|☓|https://github.com/rubyworks/htmlfilter/releases/tag/1.1<br>最新版は2009年11月25日|
|スター数/DL数|△|8 / 22k（2022年4月27日現在）|
|依存しているgemは何か|⚪|ae, detroit, microtest<br>参考：https://rubygems.org/gems/htmlfilter|