1
1

More than 3 years have passed since last update.

Railsの並び替え機能のセキュリティを改善する。

Last updated at Posted at 2021-02-07

自己紹介

2回目のQiita記事投稿です。
9月から独学でプログラミング学習を開始し、
11月からスクールを使って学習しています。
現在はポートフォリオの作成中です。
知識を定着させるために、学びをアウトプットします。
また、これから学び始める方の参考になることを願っています。


開発環境

  • Ruby 3.0
  • Ruby on Rails 6.0.3.4

並び替え機能のセキュリティを改善する

初めての投稿で
Railsで並び替え機能を実装するという記事を投稿しました。

Railsで並び替え機能を実装する
https://qiita.com/KON-ch/items/7b62fbbe308f6c5dcdec

この記事では、
下記のsort_listがViewに表示されることで
直接クエリを発行していました。

class Movie < ApplicationRecord

  scope :sort_movies, -> (sort) { order(sort[:sort]) }
  scope :sort_list, -> {
    {
      "並び替え" => "",
      "作成の古い順" => "updated_at ASC"
      "作成の新しい順" => "updated_at DESC"
    }
  }

これはデベロッパーツールなどを用いることで、
書き換えられた任意のクエリを発行することができます。
今回はこれを下記のように編集します。

class Movie < ApplicationRecord

  def sort_movies(sort)
    if sort[:sort] == "updated_at_asc"
      order("updated_at ASC")
    elsif sort[:sort] == "updated_at_desc"
      order("updated_at DESC")
    end
  end

  scope :sort_list, -> {
    {
      "並び替え" => "",
      "作成の古い順" => "updated_at_asc"
      "作成の新しい順" => "updated_at_desc"
    }
  }

このようにsort_listでは文字列として扱っています。
そしてsort_movies(sort)で受け取り、
送られてきた文字列に対応した、クエリを発行しています。
sort_listを書き換えられたとしてもクエリは発行されません。


その他

elseで例外を指定しておくと、
任意の文字列にも対応できるようになります。
また並び替えの項目が増えた場合には
下記のようにwhen caseを使用することで
すっきりと書くことができます。

def sort_movies(sort)
  case sort[:sort]
  when 'updated_at_asc'
    order("updated_at ASC")
  when 'updated_at_desc'
    order("updated_at DESC")
  else
    order("updated_at DESC")
  end
end

以上で並び替え機能のセキュリティ改善は終了です。

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