28
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

#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属性は消去されます。

ちなみに、tagsattributesを指定しないとデフォルトの設定が採用されるのですが、デフォルトでは<script>などは消されますが他は、ほぼほぼ消去されません。

デフォルトはconfigで設定可能。

config/application.rb
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

28
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?