XSS とは
概要
他人のWebサイトに悪意あるスクリプトを埋め込むことで、訪問者のクッキー情報を抜き取ったり、個人情報の不正搾取を行うこと。
悪意あるスクリプトを埋め込むためには、サイト上に入力フォームがある必要があり、この入力フォームに「悪意あるスクリプト(javascript)」を埋め込むことになる。例えば、
<script type=”text/javascript”>
alert(“ピヨピヨ”);
</script>
このように、入力フォームに「javascript」を埋め込む事が、クロスサイトスクリプティング(XSS)の基本的な手法になる。
以上が基本的なXSSの手法になるが、具体的にどういった脅威があるのか。
脅威例
「セッションハイジャック」:訪問者のクッキー(cookie)情報を抜き取ること。結果不正ログインなどを招いてしまう。
例えばECサイトでセッションハイジャックが行われてしまうと、クレジットカード情報など重要な顧客情報が盗まれてしまい、不正に買い物などが行えてしまう。
また広告システムなどのBtoBシステムでも、不正に他社アカウントを乗っ取りログインすることで数値を書き換えるなどができてしまい、大きな被害が出てしまう。
対策(rails)
XSSは、ユーザー入力がHTMLのタグやJavascriptとして認識されてしまうことで発生してしまうので、ここへの対策を打っていく事になる。
rails では、このユーザ入力をXSSが起こらないように出力してくれている。
<%= @user.name %>
という出力において、自動的に以下のとおりに変換してくれている。
- < を <
-
を >
- & を &
- " を "
- ' を '
ただこの場所でhtml.safe
というメソッドを使っていると、XSSが起きてしまう。
これはhtml.safe
というメソッドが、「エスケープ処理をしない」ようにするメソッドのため。
同様に<%= raw @user.name %>も、<%== @user.name %>も、エスケープしないようになるので注意が必要。
また、ユーザ入力値を元に、そのままHTMLを組み立てたりすると、XSSが発生する可能性があるので、注意が必要。
// Bad
document.getElementById("hoge").innerHTML = user_name
document.write(user_name)
// Safe (with jQuery)
$("$hoge").text(user_name)