2

Rails アプリ用の非常に単純なメール システムを作成しています。RESTful 認証を使用しています。ユーザーがサインアップしたときとユーザーがパスワードを忘れたときに同じメールを送信する、かなり従来の設定です。頭を包み込むことができないように見える問題が1つだけあります。

「新しいユーザー」のメールはユーザー コントローラーから送信され、「パスワードを忘れた」メールはパスワード コントローラーから送信されますが、両方のインスタンスで同じメール テンプレートを使用したいと考えています。

メールは次のようになります。

<%=h @user.name %>, 
Your membership details:
Username: <%=h @user.login %>
Password: <%=h @user.password %>

ユーザーがサインアップすると、これは問題なく機能し、次のような電子メールが送信されます。

  Bryan,
  Your membership details:
  Username: bryan
  Password: password

残念ながら、このテンプレートを使用してパスワード コントローラーから「パスワードを忘れた」というメールを送信しようとすると、すべてが機能しなくなります。しかし、私を困惑させているのは、それがちょっと壊れているだけだということです:

  Bryan,
  Your membership details:
  Username: bryan
  Password: 

つまり、@user.name は引き続き有効であり、@user.login も同様です。しかしなぜかこの状態では @user.password が通らない。

回答ありがとうございます。明確にするために言うと、この場合、セキュリティは実際には問題ではありません。そのため、パスワードをリセットするプロセスを実行するよりも、忘れたパスワードをプレーンテキストで送信できる方がよいでしょう。通常はそうではありません。

4

6 に答える 6

2

コードの一部、特にコントローラーのメソッドを見ずに言うのは難しいです。

ただし、サインアップ メールが暗号化される前のパスワードを使用している可能性があります。暗号化されていないパスワードは、データベースに暗号化されて保存されるため、通常、後のアクションでは使用できません。

ただし、パスワード コントローラーが古いパスワードを取得しようとするのではなく、新しいパスワードを設定している場合、問題は別の場所にある可能性が高くなります。

とにかく、それはコードを見ずにできる限りの憶測です。

于 2009-04-08T23:15:29.040 に答える
1

データベースを見ると、パスワード ハッシュとソルト ハッシュが表示されます。

データベースに保存する前に、プレーンテキストのパスワードを別の変数に保存する必要があります。別の変数とプレーンテキストのパスワードを使用して、それを ActiveMailer に渡し、電子メールで暗号化せずに送信できます。

@user = User.find(params[:id])
password = params[:user][:password]
options = {
    :password => password,
    :user => @user
}

if @user.update_attributes(params[:user]) and Mailer.deliver_reset(options)
    flash[:notice] = "Check your email (#{@user.email}) for your new password."
    redirect_to_back_or_default('/')
else
    flash[:error] = "Look at the errors below"
end
于 2009-04-08T23:22:59.443 に答える
1

私はサラ・メイに同意します。これは、安らかな認証がパスワードを保存する方法によるものです。通常attr_accessor :password、ユーザー モデルでは、パスワードの仮想属性を設定します。これは、サインアップ時に使用されます。サインアップ フェーズでは、ユーザー オブジェクトのパスワード属性が何かに​​設定されますが、後でユーザー レコードを取得すると、パスワード フィールドは空白になります。

とにかく、それが「最善の」方法だとは思いません。元のパスワードだけでなく、パスワードをリセットできるリンクを送信してください。

于 2009-04-08T23:29:12.440 に答える
0

restful-authentication は、パスワードを一時的にのみ保存します。パスワードを暗号化し、暗号化されたバージョンを保存するのに十分な期間だけです。他の方もおっしゃっている通りセキュリティです。

このアプリのセキュリティについてはあまり心配していないので、ユーザーごとに一意のトークンを生成し、ログインに使用する URL を提供することをお勧めします。「パスワード」(生成された場合でも) が原因で URL を推奨することは、ユーザーに変更できるという期待を与える可能性があるためです。次のようなメールをユーザーに送信できます。

 Bryan,
  Your membership details:
  Username: bryan
  Your url: http://domain.com/x7sjs0qn

ユーザーはその URL にアクセスして、自動的にログインできます。そうすれば、ユーザーが他の場所で使用する可能性のあるパスワードを提供する機会をユーザーに与えることは決してありません。また、パスワードを忘れた場合でも、平文でメールで送信でき、他のアカウントを危険にさらすことはありません。

于 2009-04-10T18:12:43.407 に答える
0

ユーザーのパスワードを知ることができないように、意図的にパスワードがハッシュ形式で保存されていると思います。ユーザーがパスワードを忘れたときに行う必要があるのは、数日間のみ有効なリンクをユーザーに送信することです。これにより、ユーザーは古いパスワードを知らなくてもパスワードをリセットできます。

于 2009-04-08T23:14:26.237 に答える