現在開発中のアプリのセキュリティ診断を行ったのですが、XSS(クロスサイトスクリプティング)とかいう脆弱性が見つかり、対応することになりました。
Web開発者としては当たり前すぎる知識らしいですが、今回対応するのが初めてだったのでなかなか手こずりました。つまずいたことがいくつかあったので、今回はその中の一つを書いていこうと思います。
実現したいこと
https://qiita.com/kamohicokamo/items/571c58f2d6738a7dfe6a
この記事を参考に、XSS対策のためにデータのサニタイズを行いたい。
例:
'山田太郎<script>alert("山田太郎です")</script>'
埋め込んだJavaScriptが実行されてしまう。これはセキュリティ的にまずい。
= sanitize '山田太郎<script>alert("山田太郎です")</script>'
このsanitize
を使うと、
このようにscriptタグが除去され、ただのテキストになる。
しかし
わざわざViewにsanitize
と書いても良いが、htmlタグが混ざっている文字列が入力された段階で無効化しておきたい。
しかし、このsanitize
メソッドはヘルパーメソッドなので、View以外では使いにくい…
方法
こんな感じのメソッドを作った。
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