こんにちは、hachi8833です。小ネタなのでQiitaに書こうかと思いましたが、こちらにしました。
Railsのビューテンプレートで配列の内容を改行brで区切って縦に一覧表示したいとき(普通ならulを使うところですがあえてbrにしています)、こんなコードを最初書いてみました。なおビューではhamlを使用しています。
#コントローラ
@my_array = ['太郎', '次郎', '花子']
#ビュー
=@my_array.join('<br/>').html_safe
が、書いてみてすぐ、このコードが脆弱なため使えないことに気付きました。ここで@my_arrayはユーザーが入力した内容をDBから取り出したものなので、ユーザー入力に悪意のあるタグが含まれていたらXSS脆弱性が発現してアウトです。ビューでユーザー入力にhtml_safeをかけるのは禁じ手です。
何かスマートな方法はないかと探してみたところ、Rails 3.1からsafe_joinというそれ用のヘルパーメソッドが追加されていました。
# File actionpack/lib/action_view/helpers/output_safety_helper.rb, line 31
def safe_join(array, sep=$,)
sep = ERB::Util.html_escape(sep)
array.map { |i| ERB::Util.html_escape(i) }.join(sep).html_safe
end
今回惜しくもRailsのバージョンが3.0だったので、上のコードをヘルパーに追加しました。また、そのままでは区切り文字までサニタイズされてしまうので、sep = ERB::Util.html_escape(sep)
は削除しました。
お互いセキュリティには気を付けましょう。