簡體   English   中英

借助rails before_action,您如何防止惡意用戶創建,更新,編輯和刪除

[英]With rails before_action how can you protect from malicious users for create / update / edit and delete

動作之前的軌道對於設置控制器中多個動作共享的變量似乎很有用。

但是,我們通常在教程等中經常看到的set_post的默認實現是否不會受到惡意用戶的攻擊?

如果我們采用這樣的控制器:

PostsController < Application Controller
  before_action :set_post , only: [:show,:create,:update]

  def show
  ...
  end

  def create
  ...
  end

  def update
  ...
  end

  private
  def set_post
    @post = Post.find(params[:id])
  end
end

當向用戶展示機會更新帖子時,例如將為他們生成表單,並且在帖子上,params [:id]將包含適當的帖子的ID(可能由current_user擁有)。

但是,對於惡意用戶而言,更改發布的:id變量以允許他們實際最終在控制器中設置@post變量(代表不同的帖子)而不是更新原始帖子並不困難。

我可以看到這更安全:

private
def set_post
  @post = Post.find(params[:id])
  if(@post.user_id != current_user.id)
   redirect_to homepage, alert: "you can edit your own posts"
  end
end

但是,這將阻止其他用戶查看其他人的帖子! 因此,應如何以及在何處執行這種檢查,以確保只有特定帖子的所有者才能更新/編輯該帖子。 這是更新控制器操作通過如下檢查來處理自身的事情:

def update
  if @post.user_id != current_user.id
    redirect_to homepage, alert: "you can edit your own posts"
  end
  ...
end

沒錯,我實際上看到新手Rails程序員經常會遇到安全問題。 他們只是生成腳手架,不會改變其需求。

我在控制器中使用了以下內容:

before_action :set_post
before_action :check_post_ownership, except: :show

private

def set_post
  @post = Post.find(params[:id])
end

def check_post_ownership
  redirect_to homepage, alert: "..." unless @post.user_id == current_user.id
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM