![](/img/trans.png)
[英]How to create a before_action that updates a Child's attributes Rails
[英]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.