0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Sinatra でエスケープするための方法

Last updated at Posted at 2023-06-02

Sinatra において, エスケープ処理を行う理由

結論から言ってしまうと, XSS 1 の対策のためです. XSS とは, ウェブサイトの脆弱性を突き, HTML に悪質なスクリプトをフォームから埋め込み, ユーザーがそのウェブサイトにアクセスすることで, スクリプトによって情報漏洩などを起こす攻撃のことです.

この XSS の対策の手段の1つとして, フォームから送られてくる文字列のうち, HTML において意味を持つような文字を別の文字に置き換えてしまうという手法があります. この手法のことをエスケープ (サニタイジング) といいます.

例えば, <&lt; に, &&amp; に置き換えられます.


方法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>
  1. 略: クロスサイトスクリプティング

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?