Sinatra において, エスケープ処理を行う理由
結論から言ってしまうと, XSS 1 の対策のためです. XSS とは, ウェブサイトの脆弱性を突き, HTML に悪質なスクリプトをフォームから埋め込み, ユーザーがそのウェブサイトにアクセスすることで, スクリプトによって情報漏洩などを起こす攻撃のことです.
この XSS の対策の手段の1つとして, フォームから送られてくる文字列のうち, HTML において意味を持つような文字を別の文字に置き換えてしまうという手法があります. この手法のことをエスケープ (サニタイジング) といいます.
例えば, <
は <
に, &
は &
に置き換えられます.
方法1 (Rack::Utils.escape_html を用いる)
Rack::Utils.escape_html
という関数を用いて, 文字列をエスケープすることができます. この時, 関数名は h
に置き換えて使うことが多いようです.
escape_with_Rack.rb
require 'sinatra'
helpers do
def h(text)
Rack::Utils.escape_html(text)
end
end
get '/' do
h('<script>alert("XSS Test")</script>')
end
test_against_xss_with_Rack.erb
<html>
<head>
<meta charset = "UTF-8">
</head>
<body>
<%= h('<script>alert("XSS")</script>') %>
</body>
</html>
方法2 (erubi の escape_html を true にする)
まず, gem として, erubi
をインストールします. そして, 以下のように, escape_html
の設定を true
にすることで, 方法1 の時とは異なり, <%= =>
で文字列を自動的にエスケープするようになります.
escape_with_erubi.rb
require 'sinatra'
set :erb, :escape_html => true
get '/' do
erb :test_against_xss_with_erubi
end
<html>
<head>
<meta charset = "UTF-8">
</head>
<body>
<%= '<script>alert("XSS")</script>'%>
</body>
</html>
-
略: クロスサイトスクリプティング ↩