LoginSignup
0
0

More than 1 year has passed since last update.

【Rails】他ユーザーの投稿やコメントを削除、他ユーザーの投稿を編集といった操作ができる状態になっていた件

Posted at

プログラミングを初めて3ヶ月。
備忘録としてつまづいたところを記載し、アウトプットツールとして活用していきます。

ポートフォリオを作成し、学習段階で身につけたスキルだったはずですが
うっかり漏れていてメンターから指摘を受けたので再発防止、備忘録の為、記載します。

他ユーザーの投稿やコメントを削除、他ユーザーの投稿を編集といった操作ができる状態になっていた。

編集ページのurlを直接打ち込んだり、削除リンクを検証ツールから書き換えることで可能なので注意しなくてはならない。
編集や削除といった操作を実装する場合、ログインユーザーのデータなのかチェックを挟む必要がある。

直打ち禁止のコード

直打ち禁止対象のcontrollerを開き
(今回は、posts_controller.rb)

posts_controller.rb
class PostsController < ApplicationController
  before_action :authenticate_customer!, except: [:show, :index]
  before_action :correct_post, only: [:edit, :update]

before_action :authenticate_customer! は、ログインしている会員のみが使用可能という意味。
今回は、except: [:show, :index]としているので、会員でなくてもshow,indexは閲覧(使用)可能。

before_action :correct_post,only: [:edit,:update]を追加。
さらに、同じposts_controller.rbに下記のコードを追加。

post_controller.rb
def correct_post
  @post = Post.find(params[:id])
  unless @post.customer.id == current_customer.id
      redirect_to post_path, alert: 'このページへは遷移できません。'
  end
end

redirect_to xxxxxxx  は、投稿者以外が直打ちした時に、遷移するページのリンクを記載。
これで、直打ち禁止ができるようになった。

削除リンクは検証ツールから書き換えることでリンクの変更が可能になっていた

例えば、、、
URLーーーーーーーーーー/post/1
URLーーーーーーーーーー/post/2
の会員が別々だとすると、post/1を投稿した会員は普通ならばpost/2の投稿は削除できないのが当たり前である。
しかし私は、、、

posts_controller.rb
def destroy
  @post = Post.find(params[:id])
  @post.destroy
  redirect_to posts_path
  flash[:notice] = "投稿を削除しました"
end

上記のように、ログインユーザーのデータなのかチェックをしていない。
この場合、デベロッパーツール(検証ツール)で削除リンクの
hrefの部分をpost/1をpost/2に変更することで
投稿した会員とは違う会員でも削除できてしまうのである。
完全に盲点であった。。。

なので、、、、下記のようにコードを修正。

posts_controller.rb
def destroy
  @post = Post.find(params[:id])
  if @post.customer_id == current_customer.id
    @post.destroy
    redirect_to posts_path
    flash[:notice] = "投稿を削除しました"
  else
    redirect_to posts_path
    flash[:alert] = "他人の投稿は削除できません"
  end
end

このように
編集や削除といった操作を実装する場合、ログインユーザーのデータなのかチェックを挟む必要がある。

ということを改めて学ぶことができた!!!

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