2012-10-25 60 views
0

空白PARAMS处理我有一个用户模式:的Rails在控制器级别

class User < ActiveRecord::Base 
    has_secure_password 
    # validation lets users update accounts without entering password 
    validates :password, presence: { on: :create }, allow_blank: { on: :update } 
    validates :password_confirmation, presence: { if: :password_digest_changed? } 
end 

我也有一个password_reset_controller

def update 
    # this is emailed to the user by the create action - not shown 
    @user=User.find_by_password_reset_token!(params[:id]) 

    if @user.update_attributes(params[:user]) 
    # user is signed in if password and confirmation pass validations 
    sign_in @user 
    redirect_to root_url, :notice => "Password has been reset." 
    else 
    flash.now[:error] = "Something went wrong, please try again." 
    render :edit 
    end 
end 

你可以看到这里的问题?用户可以提交一个空密码/确认和轨将签署他们,因为用户模式允许在更新空白。

这不是一个安全问题,因为攻击者仍然需要访问用户的电子邮件帐户,然后他们可以接近此操作,但我的问题是提交6个空白字符的用户将被登录,并且他们的密码不会为他们改变,这可能会导致后来的混乱。

所以,我想出了以下的解决方案,我想看看是否有这样做的更好的办法之前,我推到生产:

def update 
    @user=User.find_by_password_reset_token!(params[:id]) 

    # if user submits blank password, add an error, and render edit action  
    if params[:user][:password].blank? 
    @user.errors.add(:password_digest, "can't be blank.") 
    render :edit 
    elsif @user.update_attributes(params[:user]) 
    sign_in @user 
    redirect_to root_url, :notice => "Password has been reset." 
    else 
    flash.now[:error] = "Something went wrong, please try again." 
    render :edit 
    end 
end 

我应该检查零以及空白?有没有任何轨道模式或惯用的ruby技术来解决这个问题?

[FWIW,我已经上了HTML输入required: true,但希望这种处理服务器方太。]

+0

只是为了澄清,用户无法创建使用空白密码权限的新帐户?只有在更新时,他们目前可以有一个空白的密码和密码确认,您想要防止,更正? – John

+0

是啊,只有更新,并不会改变他们的密码消化所有 – stephenmurdoch

+0

你为什么让他们节省更新密码为空?为什么不只是删除allow_blank? – John

回答

0

请试试这个:

我们可以使用 - 礼物?

例:

if !params[:user][:password].present?