概要

  • RailsでSlimを書いている時に<%= link_to ~ %>== link_to ~と書いていたが、= link_to ~でも書けると知った。
  • しかし、==で書くべきか、=で書くべきなのかの使い分けが分からなかったため調べてみたところエスケープの有無で使い分けるということが分かった。
  • そもそもエスケープとは何か、どのような意味があるのかを理解するために、更に深掘りして勉強を進めた。
  • エスケープは「HTML上で特殊文字を表現するための処理」であり、エスケープをしないと クロスサイトスクリプティング(XXS)という動的サイトの脆弱性を突く攻撃を受ける可能性が生じることが分かった。

要点

エスケープとは

エスケープとは、HTML上で特殊文字を期待通りに表示するために施す処理のことです。
特殊文字に指定されている文字は、割り当てられている記号を記述することで、表示することができます。
例えば、<は<であったり、はなど、特殊文字には必ず該当する記号が割り当たっています。

エスケープをしない危険性

あなたがフォームなどで閲覧している人が文字を入力して送信するなどのサイトを作った場合があるとします。
この時、エスケープ処理を施さないことで、クロスサイトスクリプティング(XSS)という攻撃の標的にされることがあります。
詳細は省きますが、第三者が自由に入力できる部分がサイト内にあった場合は、エスケープ処理を怠らないようにしましょう。

XSSとは

クロスサイトスクリプティングは、エンドユーザー側がWebページを制作することのできる動的サイト(例:Twitter、掲示板等)に対して、自身が制作した不正なスクリプトを挿入するサイバー攻撃です。

クロスサイトスクリプティングの根本的な原因は、文字通り攻撃者が不正なスクリプトを挿入することができる環境を与えてしまうことにあります。つまり、クロスサイトスクリプティングに対して脆弱性を持つ動的サイトの放置です。


(出典元:クロスサイトスクリプティングとは?仕組みと事例から考える対策)

  • 意図していないのに自分のサイトで他人のプログラムが実行されるのは危険と思える感覚を持つことが重要。

エスケープの有無の具体例

  • Rails × Slimで以下の記述をした時、記述(1)では文字が出力されて(2)ではアラートが出てくる。
# 記述(1)  
=  "<script>alert('Hello JS');</script>"  

# 記述(2)  
==  "<script>alert('Hello JS');</script>"  

結論

Rails × Slimでエスケープするかしないの考え方について

  • 「使用者が意図していないのにプログラムが実行される可能性があるかどうか」で判断する。
  • 大抵のテンプレートエンジンはエスケープする。
  • Railsにおけるrenderやyieldなどを用いた場合に、テンプレート読み込み先でエスケープしたくない出力がある(=実行させたいプログラムがある)ならばエスケープしない。
  • まずは難しく考えず、エスケープさせるのはフレームワークにまかせてそうしたくないときにそれに関して考えればよい。

参考URL