title-logo

Rails で raw HTML を sanitize する

January 25, 2015

ブログのようなアプリケーションを作ろうとしていて、フォームのテキストエリアをリッチテキストエディタ化するために tinymce-rails を使おうとしています。当然そこで入力した内容は HTML になるので、表示するときには html_safe などでエスケープされないようにしないといけません。

が、やっぱり raw html をそのまま出すのは怖いので SanitizeHelpersanitize メソッド を使ってみることにしました。

sanitize メソッドはホワイトリスト方式で動作し、許可されているタグの要素や属性以外を削除します。デフォルトでも <script>...</script> とかを掃除してくれたので、そのまま使ってもいいかと思ったんですが、許可するタグと要素を明示的に設定しました。

ヘルパーを呼び出すときに指定する

ヘルパーを呼び出すときにはこんな感じで指定します。

sanitize @article.body, tags: %w(h1 h2 h3 h4 h5 h6 ul ol li p a img table tr td em br strong), attributes:  %w(id class href)

アプリケーションのデフォルト設定として指定する

config/application.rb にこんな感じで。

config.action_view.sanitized_allowed_tags = %w(h1 h2 h3 h4 h5 h6 ul ol li p a img table tr td em br strong)
config.action_view.sanitized_allowed_attributes = %w(id class href)

カスタム Scrubber なんかも定義できるみたいですが、とりあえず今は不要なのと、眠すぎるのでこれだけ。