- フィヨルドブートキャンプでRuby on Railsを用いたWebセキュリティの勉強をしたので備忘録を残します。 (※レビューにおいて「違う方法でやってね」と、ご指摘を頂いた内容だけピックアップして書いたので、プラクティスそのままの参考にはなりません。)
XSS対策
XSSとは
- ユーザが注入した何らかのコードがアプリケーションに保存され、それが標的ユーザのWebページ上に表示されたときにコードが実行されてしまうこと。
cookieを盗み出したり、セッションハイジャック、偽のWebサイトへ誘導するなどの被害が起きてしまう。
Railsでの対策
- Railsではデフォルトでエスケープ処理機能が組み込まれている。こちらを利用する。
- ただし、このままだとユーザの入力した改行入力(
\n
)もエスケープ処理されてしまい、ユーザの入力した内容を表示する時に改行が反映されなくなってしまう。CSSでの改行表示
- 以下のような設定をcssへ追加することで改行表示を行う。
.blog-content { white-space: pre-wrap; }
white-space: pre-wrap
pre-wrap
連続するホワイトスペースはそのまま残されます。 行の折り返しは、改行文字や
<br>
要素のあるときか、行ボックスを埋めるのに必要なときに行います。
<div class="blog-content"> <%= blog.content %> </div>
カスタムバリデーション
問題設定
- 開発者ツールで直接
hidden
パラメータを追加するとrandom_eyecatch
(有料機能)が変更可能となっている - 入力内容:
<input type="hidden" name="blog[random_eyecatch]" value="1">
モデルでのバリデーションチェックを実施する
モデルでカスタムバリデーションを定義する
- Active Record バリデーション - Railsガイド
- カスタムバリデーションの命名において、定義したメソッドがバリデーションであることを明確にする命名にすべき。
validate_
やmust_
など
バリデーションの定義
class Blog < ApplicationRecord # カスタムバリデーションメソッドの定義 def validate_random_eycatch_equal_premium return if user.premium # premiumユーザであればOKなので早期return errors.add(:random_eyecatch) if random_eyecatch end end
errors.add(:random_eyecatch)
- バリデーションエラーに対して
random_eyecatch
というエラーを追加 random_eyecatch
フィールドに関するエラーメッセージがerrors
コレクションに追加される。
- バリデーションエラーに対して
- カスタムバリデーションメソッドの呼び出し
validate
クラスメソッドにカスタムバリデーションメソッド名を指すシンボルを渡す
class Blog < ApplicationRecord # 追加 validate :validate_random_eycatch_equal_premium, on: %i[create update] def validate_random_eyecatch_equal_premium return if user.premium errors.add(:random_eyecatch) if random_eyecatch end end
on:
オプションBlog
モデルの指定のアクションのときだけバリデーションチェックを行うようにするon: %i[create update]
で createとupdateアクションだけをチェック
- 通常ユーザが有料機能を挿入しようとした場合にバリデーションエラーとなる。
おわりに
- 勉強した内容を忘れないようにこれからもブログに残すように心がけたいです。