ビューでエスケープする方法 - Sinatra

エスケープについて

Sinatra のテンプレートは、erb を使用しています。標準では「 <%= %> 」は、エスケープされません。

eRuby(erb)は、Ruby のコードを埋め込むことができるテンプレート言語の名前です。ちなみに、Rails では「 Erubi 」を改造したものを使用しています。

ビューに以下のタグを埋め込むと、Javascript が実行されます。

<%= '<script>alert("XSS")</script>' %>

上記の値がフォームなどで入力され、データベースに保存されるとします。その後、HTML ファイルに上記の値が埋め込まれ、実行されると予期せぬ動作をすることになります。

そのため、Javascript が実行されないように、「 < > 」を特殊文字に変換してエスケープします。そうすることで予期せぬ動作を引き起こさないようにできます。

Sinatra でエスケープするには、Rack::Utils の escape_html メソッドを使います。ビューで利用するには、helper メソッドを作成して利用します。

HTML タグをエスケープするヘルパーを作成する

HTML タグをエスケープするにはヘルパーメソッドを作成します。

helpers do
  def h(text)
    Rack::Utils.escape_html(text)
  end
end

ビューでエスケープしたいタグを以下のように記述します。

<%= h'<script>alert("XSS")</script>' %>

erubi を使ってエスケープする方法

Ruby の gem である erubi をインストールします。

escape_html の設定を有効にすることで「 <%= %> 」の文字列を自動的にエスケープすることができます。

app.rb

require 'sinatra'

set :erb, :escape_html => true

get '/' do
  erb :index
end