Ruby on RailsでのWebセキュリティについて勉強したメモ

  • フィヨルドブートキャンプでRuby on Railsを用いたWebセキュリティの勉強をしたので備忘録を残します。 (※レビューにおいて「違う方法でやってね」と、ご指摘を頂いた内容だけピックアップして書いたので、プラクティスそのままの参考にはなりません。)

XSS対策

XSSとは

  • ユーザが注入した何らかのコードがアプリケーションに保存され、それが標的ユーザのWebページ上に表示されたときにコードが実行されてしまうこと。 cookieを盗み出したり、セッションハイジャック、偽のWebサイトへ誘導するなどの被害が起きてしまう。

    Railsでの対策

  • Railsではデフォルトでエスケープ処理機能が組み込まれている。こちらを利用する。
    • .erb<%= %>を用いることで、自動的にエスケープ処理(特別な意味を持つ記号文字(「<」、「&」など)をただの文字列として認識させる)してくれる。
    • <%== %>とするとエスケープ処理を無効化するため、明確な理由がなければ使わない。
  • ただし、このままだとユーザの入力した改行入力(\n)もエスケープ処理されてしまい、ユーザの入力した内容を表示する時に改行が反映されなくなってしまう。

    CSSでの改行表示

  • 以下のような設定をcssへ追加することで改行表示を行う。
.blog-content {
  white-space: pre-wrap;
}
<div class="blog-content">
  <%= blog.content %>
</div>

カスタムバリデーション

問題設定

  • 開発者ツールで直接 hiddenパラメータを追加すると random_eyecatch(有料機能)が変更可能となっている
  • 入力内容:<input type="hidden" name="blog[random_eyecatch]" value="1">

モデルでのバリデーションチェックを実施する

  • モデルでカスタムバリデーションを定義する

  • バリデーションの定義

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:オプション
  • 通常ユーザが有料機能を挿入しようとした場合にバリデーションエラーとなる。

おわりに

  • 勉強した内容を忘れないようにこれからもブログに残すように心がけたいです。