DraperとSanitizeを利用したサニタイズ
はじめに
ウェブアプリケーションを作成していると、ユーザに対してHTMLタグを入力、管理させる場面が度々出てくるかと思います。それは例えば、文字列の装飾であったり、ブログの隅に置かれたウィジットであったりです。
これを行う際に便利なのが、DraperとSanitizeです。
実装
Draperでモデルとビューの間にプレゼンテーション層を追加します。そこでSanitizeを呼び出すことにより、出力されるスクリプトから、問題のありそうなコードを削除して、適切なサニタイズの行われた文字列を取り出すようにします。
以下の例ではContentモデルのbodyというattributeをサニタイズしております。
irb(main):001:0> Content.last.body
=> <span>foooo</span>
irb(main):002:0> Content.last.decorate.body
=> foooo
タグやスクリプトのSanitizeというと、Railsではヘルパーのイメージがあります。ですが、その扱いはセキュリティ上、見栄え以上に重要な位置にございます。なので一箇所でまとめて管理したいなと考える昨今です。結果的に落ち着いたのがデコレータ、といった塩梅でございます。