[sinatra]padrino-helpersを使って自動エスケープ


sinatra + active record を使ったアプリを作っていたらいつの間にかviewが自動でエスケープされるようになっていました。

確かsinatraは手動エスケープする必要があったはず、と思い以下のシンプルなアプリを実行してみたところ、

# app.rb
require 'sinatra/base'

module Sample
  class App < Sinatra::Base
    get '/' do
      erb :index
    end
  end
end


# views/index.erb
<%= "<b>Hello World</b>" %> 

やはり、以下のようにエスケープされずにbタグが実行されました。

sinatra1

というわけでsinatra自身が自動エスケープしているのではありませんでした。

そこで、何が自動エスケープしてくれているのか調査してみたところ、ページャ実現のために使用している

Kaminari::Helpers::SinatraHelpers

の中で自動エスケープ機能が定義されているようでした。

# app.rb
require 'sinatra/base'
require 'padrino-helpers'
require 'kaminari/sinatra'

module Sample
  class App < Sinatra::Base
    register Kaminari::Helpers::SinatraHelpers
    get '/' do
      erb :index
    end
  end
end


# views/index.erb
<%= "<b>Hello World</b>" %> 

この状態だと以下のようにエスケープされます。

sinatra2

さらに追ってみると、kaminari/sinatraが依存している、padrino-helpersが自動エスケープ機能を提供してくれていました。

padrino-helpers単体で使用する場合は register Padrino::Helpers を記述します。

require 'sinatra/base'
require 'padrino-helpers'
module Sample
  class App < Sinatra::Base
    register Padrino::Helpers
    get '/' do
      erb :test
    end
  end
end

また、エスケープを解除したい場合は、<%==のように二重イコールを使用します。

<%== "<b>Hello World</b>" %>

参考