Railsのエスケープとかについて、知識が曖昧だったので調べてみる
また後日、きちんと調べる
##XSS(クロスサイトスクリプティング)攻撃
まず、エスケープを知る前にこの攻撃方法を知っとかないといけない
XSS(クロスサイトスクリプティング:Cross Site Scripting)とは、
ユーザーに表示するコンテンツに悪意のあるスクリプト(主にJS)を
仕掛け、そのコンテンツを表示したユーザーにスクリプトを実行させることで
任意の操作をさせる攻撃のこと
Webアプリにおいて、動的にhtmlを出力する時、
そのデータをエスケープしていないと
悪意のあるhtmlやjavascriptが紛れ込む
JSは、ブラウザ上で動作し
Cookieなども更新することができたりするのでセキュリティには気をつける
例)クリックするとセッションIDが盗まれてしまう
任意のメッセージや処理が行われる など
##どう対策するか
ユーザーの入力した文字を出力する際に
自動的にHTMLをエスケープ
する必要がある
デフォルトでエスケープさせる
###エスケープとは
スクリプトを実行する対象となる文字列を
無害な文字に置き換えること
& → &
" → "
< → &li;
> → >
##エスケープしたくないとき
この自動的にHTMLをエスケープしてくれる仕組みは、便利だが
どんなときも文字列をエスケープしたいかというとそうではない
このようなときは、以下のメソッドを使用する
##String#html_safe
html_safeメソッドそれ自体は何らエスケープを行なっていないという
安全であるとマーキング
しているに過ぎないので注意する
s = "".html_safe
s.html_safe? # => true
s = "<script>...</script>".html_safe
s.html_safe? # => true
s # => "<script>...</script>"
あくまで、「s」にはまだスクリプトが埋め込まれている状態
特定の文字列に対してhtml_safeメソッドを呼び出す際には、
その文字列が本当に安全であることを確認する
義務がある
"<em>#{text}</em>".html_safe
#=> ヘルパーを使う
content_tag :em, text
- 安全でない文字列をエスケープ無しで出力しない
- ヘルパーでタグを出力する
##sanitizeメソッド
ある程度タグをそのまま出したいものの、危険なタグは
出力しないようにしたいという場合に利用する
出力できるタグをホワイトリスト形式で制限する
sanitizeはフィルタした結果のHTMLに対して
「String#html_safe」を実行して返すので
さらに、「raw」や「String#html_safe」を使う必要がない
<% @comment = "<script>alert('Hello');<script>
<%= sanitize @comment %>
#生成されるHTML
<div>alert('Hello');</div>
##参考記事
https://railsguides.jp/active_support_core_extensions.html
https://qiita.com/kamohicokamo/items/571c58f2d6738a7dfe6a
https://techracho.bpsinc.jp/hachi8833/2016_08_31/25326
https://qiita.com/sutetotanuki/items/5eda6bbb5532dd64529a#%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0xss
https://railsguides.jp/security.html
https://www.websec-room.com/2013/03/14/567
https://blog.tamesuu.com/2019/10/14/459/
https://yuruli.info/rails5-using-escape-methods/