2015-06-24 74 views
1

我的網址看起來像這樣username/project/project_members 用戶有很多項目,用戶和項目之間也有豐富的多對多關係。把它想象成github,一個用戶有很多回購站點,一個回購站點有很多合作者作爲用戶。強參數

我們做ProjectMember的新對象,我所能做的質量分配:

ProjectMember.create(user_id: params[:user_id], project_id: @project.id, role: params[:project_member][:role]) 

或者我可以這樣做:

@project.members << @member 
@project.member_project(role: params[:project_member][:role]) 

可以這樣說,在這兩種情況下,我需要找到首先是@project和@member對象。要找到@member,我已經將user_id作爲隱藏字段傳遞,並且我的url找到了@project(請參見上圖)。我的表單看起來像:

- @users.each do |user| 
    = form_tag user_project_project_members_add_path(@project.user, @project) do 
    = label_tag 'username', user.username 
    = hidden_field_tag "user_id", user.id 
    = select('project_member', 'role', roles) 
    = submit_tag 'Add', :name => nil 

這種類型的代碼會留下強烈的參數無用的。即我沒有用它來創建我的新project_member實例。 我應該擔心我沒有使用強烈的參數嗎?我想黑客可能是我將project_id作爲隱藏字段。我是否應該向後彎腰,以便使用強烈的參數?

回答

0

那種質量分配,導致漏洞的是,當你正在做的:

User.create(params[:user]) 

然後一個的惡意用戶將通過{ user: { name: 'Haxxor', admin: true }}和你的整個應用程序被攻破。

直到Rails 4,Rails會高興地讓你這樣做。

沒有做任何真正的危險:

ProjectMember.create(
    user_id: params[:user_id], 
    project_id: @project.id, 
    role: params[:project_member][:role] 
) 

即使你與你實際上是手動分配參數去每個屬性的哈希創建ProjectMember。

+0

gotcha!謝謝。 – sonalkr132