プログラミングを初めて3ヶ月。
備忘録としてつまづいたところを記載し、アウトプットツールとして活用していきます。
ポートフォリオを作成し、学習段階で身につけたスキルだったはずですが
うっかり漏れていてメンターから指摘を受けたので再発防止、備忘録の為、記載します。
他ユーザーの投稿やコメントを削除、他ユーザーの投稿を編集といった操作ができる状態になっていた。
編集ページのurlを直接打ち込んだり、削除リンクを検証ツールから書き換えることで可能なので注意しなくてはならない。
編集や削除といった操作を実装する場合、ログインユーザーのデータなのかチェックを挟む必要がある。
直打ち禁止のコード
直打ち禁止対象のcontrollerを開き
(今回は、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に下記のコードを追加。
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の投稿は削除できないのが当たり前である。
しかし私は、、、
def destroy
@post = Post.find(params[:id])
@post.destroy
redirect_to posts_path
flash[:notice] = "投稿を削除しました"
end
上記のように、ログインユーザーのデータなのかチェックをしていない。
この場合、デベロッパーツール(検証ツール)で削除リンクの
hrefの部分をpost/1をpost/2に変更することで
投稿した会員とは違う会員でも削除できてしまうのである。
完全に盲点であった。。。
なので、、、、下記のようにコードを修正。
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
このように
編集や削除といった操作を実装する場合、ログインユーザーのデータなのかチェックを挟む必要がある。
ということを改めて学ぶことができた!!!