2012-10-25 34 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?