2014-02-20 44 views
0

我正在写一个模块,限制用户只能在他们的资源上执行操作。说,只有房客1 belongs_to他/她,房东才能做GET /tenants/1Rails:是否可以使用HTTP请求(Devise,protect_from_forgery)更新外键?

在租户控制器我的代码

respond_to do |format| 
    if @tenant.update_attributes(params[:tenant]) 
    format.html { redirect_to @tenant, notice: 'Tenant was successfully updated.' } 
    format.json { render json: @tenant } 
    # else ... 
end 

以下块的更新操作是否有可能为landlord在他tenant更新外键,让tenant的记录可能移动到其他landlord的帐户?我使用Devise在应用程序控制器中使用protect_from_forgery进行身份验证。我可以从浏览器中的HTML页面源提取authenticity_token,但带有该标记的cURL请求失败 - 警告:无法验证CSRF令牌的真实性。

有没有办法在HTTP请求的记录上伪造外键?我是否需要检查在params散列中传递的外键?

回答

0

如果你不想允许这样做,你应该使用强参数。

在你的控制器:

def tenant_params 
    params.require(:tenant).permit(:name, :address ...) # make sure :landlord_id is not there 
end 

而在你的更新动作:

respond_to do |format| 
    if @tenant.update_attributes(tenant_params) 
    ... 

这样一来,即使在情况不太可能发生,有人成功招数用户访问一个页面,以便阐述这种意愿实际上可以绕过csrf标记并将一个landlord_id参数发送到更新操作,因此该参数将被忽略,因为它显式不被允许。

还有另一种方法,例如,如果你的字段列表太长处理或您自己的任何其他原因,而不是使用强大的参数,你可以从后弦删除参数:

在您的更新操作中:

params[:tenant].except!(:landlord_id) if !params[:tenant][:landlord_id].nil? #don't forget to use the "bang" (!) 
respond_to do |format| 
    if @tenant.update_attributes(params[:tenant]) 
    .... 
+0

感谢您的建议 - 我喜欢它。 – sakovias

+0

然后你可以给它一个正面的投票,或者选择它作为答案。谢谢。 –

+0

我选择了这个作为答案,但由于我的低调,我无法赞成。干杯! – sakovias

相关问题