動作之前的導軌對於設置控制器中多個動作共享的變量似乎很有用。使用rails before_action如何防止惡意用戶創建/更新/編輯和刪除
但是,不是我們通常在教程中看到的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 - 可能由current_user擁有。
但是,對於惡意用戶來說,修改posted: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
對於政策的邏輯,你可以使用寶石權威人士或cancancan。 – Gearnode