#Railsのsanitize
##はじめに
今回はsanitize
についてです。cachingはいつやるんでしょうね...(ごめんなさい)
XSS対策において活躍するsanitize
をご紹介します。
##XSS(クロスサイトスクリプティング)とは
XSSとはWebアプリケーションにおいて、動的にhtmlを出力する時、そのデータをエスケープしていないが為に、悪意のあるhtmlやjavascriptが紛れ込むことです。
良いサイトがあったのでご紹介します。
XSS攻撃を体験サイト
http://www.ne.senshu-u.ac.jp/~proj28-19/tasa/xss/xss1.html
上記のようにきちんと対策しないと、jsをページに埋め込むことができ、他ユーザーをいろんなサイトに飛ばしたりできるのです。
##どう対策するか
簡単です。sanitize
を使うだけです。(htmlエスケープも対策となりますが、今回はsanitizeをご説明。)
= sanitize "<h2>sanitize</h2><p>テスト</p>", tags: %w(h2 p)
最初に対象となる文字列、次に許可するhtmlタグを配列で指定します。(%wは配列を生成します。)
ちなみにsanitizeはエスケープではありません。なので例えば以下の場合、<h1>
は消去されます。
= sanitize "<h1>sanitize</h1><p>テスト</p>", tags: %w(h2 p)
今試しにqiitaの記事編集フォームで<script>
を埋め込んでみましたが、見事に消去されてました。
また、許可する属性も設定するときは、以下のように書きます。
= sanitize "<h1>sanitize</h1><a href='test.html'>テスト</a><img src='buhi.png'>", attributes: %w(href), tags: %w(h1 a img)
上記の場合、href属性は許可しますがsrc属性は消去されます。
ちなみに、tags
とattributes
を指定しないとデフォルトの設定が採用されるのですが、デフォルトでは<script>
などは消されますが他は、ほぼほぼ消去されません。
デフォルトはconfigで設定可能。
config.action_view.sanitized_allowed_tags = ['strong', 'em', 'a']
config.action_view.sanitized_allowed_attributes = ['href', 'title']
##まとめ
ひとまず簡単なsanitizeのご紹介でした。他にもカスタマイズする方法など掘り下げれば色々あるのですが、時間がないので今日はここまでにします。
##参考にしたの
ActionView::Helpers::SanitizeHelper
https://api.rubyonrails.org/v5.1/classes/ActionView/Helpers/SanitizeHelper.html