0
1

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 3 years have passed since last update.

sanitizeメソッドをView以外で使いたい。

Last updated at Posted at 2020-10-11

現在開発中のアプリのセキュリティ診断を行ったのですが、XSS(クロスサイトスクリプティング)とかいう脆弱性が見つかり、対応することになりました。
Web開発者としては当たり前すぎる知識らしいですが、今回対応するのが初めてだったのでなかなか手こずりました。つまずいたことがいくつかあったので、今回はその中の一つを書いていこうと思います。

実現したいこと

https://qiita.com/kamohicokamo/items/571c58f2d6738a7dfe6a
この記事を参考に、XSS対策のためにデータのサニタイズを行いたい。

例: 

name.html.haml
'山田太郎<script>alert("山田太郎です")</script>'

このまま表示すると、
スクリーンショット 2020-10-12 1.19.46.png

埋め込んだJavaScriptが実行されてしまう。これはセキュリティ的にまずい。

= sanitize '山田太郎<script>alert("山田太郎です")</script>'

このsanitizeを使うと、

スクリーンショット 2020-10-12 1.19.28.png

このようにscriptタグが除去され、ただのテキストになる。

しかし

わざわざViewにsanitizeと書いても良いが、htmlタグが混ざっている文字列が入力された段階で無効化しておきたい。

しかし、このsanitizeメソッドはヘルパーメソッドなので、View以外では使いにくい…

方法

こんな感じのメソッドを作った。

model
def remove_script_tag(str)
  ActionController::Base.helpers.sanitize(str)
end

sanitizeメソッドはデフォルトでは<script>タグくらいしか除去してくれないので、remove_script_tagとしてある。

このメソッドをbefore_validationなりbefore_saveでうまいこと使えば、悪意のあるスクリプトが文字列として送られてきても無効化することができるはず。

環境

ruby 2.6.6
rails 6.0.3.2

0
1
4

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?