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

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833 コボラー、ITコンサル、ローカライズ業界を経てなぜかWeb開発者志願。 これまでにRuby on Rails チュートリアルの大半、Railsガイドのほぼすべてを翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ