LoginSignup
0
1

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

Last updated at Posted at 2022-07-21

htmlサニタイザーとは

サニタイズとは、主にHTMLやJavaScriptなどでWebサイトの表示や機能を記述するために用いられる特殊文字を、単純な文字として扱いたい場合に行われる。

なぜサニタイズをする必要があるかというと、Webサイトに設置された入力フォームなどから、悪意のあるスクリプトコードが入力されると、その文字列が解釈・実行されることで様々な被害に遭う恐れがあるためである。

想定している読者のニーズ

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

想定してないニーズ

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
0
1
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
0
1