おはようございます。わてぷです。
先日、下記の勉強会に行ってきました。
そこで、Railsのセキュリティについていくつか学んだのですが、その中で、今回はRailsでエスケープ処理をしないようにするにはどうすれば良いのかを見ていきます。
エスケープ処理について
簡単に言うと、文字列の処理のこと。
例えば、Railsでよくあるような投稿機能を持ったアプリがあるとしましょう。
ここで投稿する際に、<script>と入力して投稿すると、
- エスケープ処理していなければ、そのままscriptタグとして認識
- エスケープ処理していれば、<を &lt; 、>を &gt; と変換し別の文字列として認識
と言うことが起こります。
なぜエスケープ処理が必要なのかというと、JavaScript等で作られた悪質なプログラムを作動しないようにするためです。
エスケープ処理していなければ、上記のようにそのままscriptタグとして読み込んでしまい、中に書かれているコードが実行されてしまいます。
Railsのエスケープ処理
デフォルトでエスケープ処理するようになっている
さて、Railsですが、デフォルトでエスケープ処理されるようになっております。
なので、投稿画面等で上記のようなscriptタグのついたコードが投稿されても、別の文字列として認識されますので、タグの中のコードが実行されることはありません。
エスケープ処理を停止させるには
エスケープ処理を停止させるメリットは特に思いつかないのですが・・・
(この前の勉強会の時みたく、あえて脆弱性のあるアプリを作成するときくらい?)
結論から言うと、.html_safeをつけることで、エスケープ処理を停止させることが可能です。
例えば、投稿機能を持つアプリなんかはindexに情報を表示するため、以下のように書くことがあるかと思います。
1 2 3 |
<% @blogs.each do |blog| %> <%= blog.content %> <% end %> |
これだけならエスケープ処理がされていますが、ここに
1 2 3 |
<% @blogs.each do |blog| %> <%= blog.content.html_safe %> <% end %> |
と、.html_safeと入力することで、エスケープ処理が停止されるようになります。
まぁ、普通に作成する分には、わざわざつける必要性はなさそうですね。
(どうでも良いですが、WordPressのエディターを変えてから、ソースコードの入力に手間取るようになった。
それこそ、エスケープ処理されて、うまく表示できず・・・
ちゃんと投稿できただろうか・・・)
コメント