0

私はユーザーモデルを持っています:

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

空白だけでなく nil もチェックする必要がありますか? これを解決するためのレールパターンや慣用的なルビーテクニックはありますか?

[Fwiw、私はrequired: truehtml入力を取得しましたが、これをサーバー側でも処理したい.]

4

1 に答える 1

0

これを試してください:

私たちは使用することができます -現在?

元:

if !params[:user][:password].present?
于 2012-10-25T05:05:34.637 に答える