Tech Racho エンジニアの「?」を「!」に。
  • 開発

[Rails]ビューで配列を改行するなら脆弱なjoinではなくsafe_joinにしよう

こんにちは、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)は削除しました。
お互いセキュリティには気を付けましょう。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。