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
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