ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

Sinatraでよく使うツール その3

今回はスクリプトエスケープするメソッドについて。

目次


escape_htmlメソッド

スクリプトエスケープするにはRack::Utilsのescape_htmlを使う。

メソッド名を変更する

escape_htmlメソッドはhと名称を変えて使うことが多いらしい。
変更するにはalias_methodメソッドを使ったりdefで再定義する方法がある。
Sinatraではhelpersの中で定義するとどこでも呼び出せるようになる。

alias_methodを使って変更する

require 'sinatra'

helpers do
    include Rack::Utils
    alias_method :h, :escape_html
end


defで再定義

require 'sinatra'

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


使い方

実際にSinatraのコードを書いてみる。
今回の環境はVirtualBox Vagrant Ubuntu
Sinatraはbundlerの--pathオプションでインストール。

main.rb

require 'sinatra'
#-o [ipアドレス]オプションを不要にする
set :environment, :production

#escape_htmlをhに変更する
helpers do
    include Rack::Utils
    alias_method :h, :escape_html
end
#もしくは次のコードでも同じ
=begin
helpers do
   def h(text)
       Rack::Utils.escape_html(text)
   end
end
=end

#indexページを作成
get '/' do
    erb :index
end

#フォーム入力値を受け取って表示する
post '/escape_test' do
    @str = params[:str]
    #エスケープして表示
    "#{h @str}"
end


viewsディレクトリの中にindex.erbを配置する。
このページで入力を受け付ける。
views/index.erb

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
</head>
<body>
    <form action="escape_test" method="post">
        <input type="text" name="str">
        <button type="submit">submit</button>
    </form>
</body>
</html>


実行する

実行してみる。

main.rbの起動

bundle exec ruby main.rb


set :environment, :productionを使わない場合は-oが必要。

bundle exec ruby main.rb -o 192.168.33.**

192.168.33.**にはVagrantfileで設定したipアドレスが入る。


ブラウザで確認する
ブラウザにURLを入力して表示する。

http://192.168.33.**:4567


macOSWindowsの場合は

http://localhost:4567



フォーム入力
次のようにstyleを入力してsubmitしてみる。

<span style="color: red;">ボート競技は最高!</span>


エスケープされると<span>タグが文字列となって表示される。

<span style="color: red;">ボート競技は最高!</span>

こうなればエスケープ成功。

hがない場合

"#{h @str}""#{@str}"としてSinatraを再起動する。
先ほどと同じ文字列を入力してsubmitする。

ボート競技は最高!


hがないとstyleが有効になり赤い文字で表示されてしまう。
悪意のあるスクリプトエスケープする必要がある。

ドキュメント

Rubyリファレンスマニュアル
class Module > #インスタンスメソッド
alias_method
https://docs.ruby-lang.org/ja/latest/class/Module.html

Sinatra Top > DOCS
FREQUENTLY ASKED QUESTIONS
How do I escape HTML?
http://sinatrarb.com/faq.html