2

使用铁路的simple_form宝石:

如果我= f.input :password, :required => true提交了表单并且它包含错误,那么我输入的密码就会在页面重新加载时消失。如果我使用= f.input :password, :required => true, :as => :text它,一切都会像预期的那样工作,那么显然对密码字段有不同的处理方式。

如何记住密码字段的值?

编辑:有些人似乎不明白我说的是用以前输入的值重新显示相同的表单。这个问题与数据库无关,实际上在那种情况下甚至没有任何东西保存在数据库中。对于 PHP 人来说,这相当于<input name="pass" type="password" value="<?= $_POST['pass']; ?>">

4

3 回答 3

6

关于问题,答案是使用input_html: { value: @user_password }

像这样:

<%= f.input :password, :required => true, input_html: { value: @user_password } %>
<%= f.input :password_confirmation, :required => true, input_html: { value: @user_password } %>

关于恢复密码值的次要主题,经过调查,它更像是一个额外安全漏洞。真正的安全性是通过使用 HTTPS 来完成的,或者通过使用 javascript 对客户端进行密码散列处理,这样服务器甚至都不知道密码。

例如,即使像https://github.com/join这样大的网站似乎也按照我的方式进行操作(填写密码但输入无效的电子邮件,然后看到密码被填写为纯 HTMLvalue元素)。

对应的路由和控制器可能如下所示:

路线.rb:

devise_for :users, :controllers => {registrations: 'users/registrations' }

注册控制器.rb:

class Users::RegistrationsController < Devise::RegistrationsController
  # build_resource is called inside the new and create methods
  def build_resource(*args)
    if params[:user]
      # So that the password isn't blanked out when the other validations fail. User shouldn't have to retype the password.
      @user_password = params[:user][:password]
    end
    super
  end
end
于 2013-11-04T12:31:55.827 回答
4

这不是 SimpleForm 行为,它是 Rails 处理密码类型输入的方式(参见http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-password_field)。

SimpleForm 使用password_field默认为空值的 rails 方法。API 明确表示通过options参数设置值。

于 2013-11-17T21:16:00.893 回答
2

我不确切知道 Rails 是如何处理这个问题的,但如果我是手动编写的,比如用 PHP,然后在验证错误后将输入的表单数据返回到表单中,那么我将不得不将数据呈现回每个输入的价值属性。

从技术上讲,没有什么可以阻止我输入密码,但这意味着我必须将他们自己的密码以纯文本形式传回给他们。我认为这会破坏交易,因为它为密码被拦截提供了另一个机会。

在阅读了这个主题之后,似乎很多人认为这也是一种以纯文本“存储”密码的形式,这显然很糟糕。但是,我完全不清楚为什么将其视为“存储”密码,因为服务器显然不需要将纯文本密码存储在用于接收纯文本密码的相同变量中的任何地方第一名。但是,它们可能意味着密码存储在 HTTP 响应中,这与我在上面提出的问题基本相同。

我看到的另一个原因是将密码重新插入密码输入需要使用 value 属性。虽然这会掩盖渲染输入中的密码,但在使用例如 Firebug 检查源时,密码将是可见的。对我来说,这不是问题,因为将输入的类型从密码转换为文本并显示密码是微不足道的,或者只是使用 JS。认为密码字段除了在视觉上掩盖密码之外还提供了很多内置的安全性,这是绝对错误的。

你可以做的是:

  1. 散列密码(假设它本身通过验证)并存储它,即使其余数据未通过验证
  2. 禁用返回表单上的密码字段,或以其他方式向用户表明他们提交的密码已被接受,但需要修复其余的表单数据。
  3. 如果用户决定需要不同的密码,则可以选择为用户提供重新激活密码字段的方法。
  4. 运行一个 cron 任务,定期清理数据库中的任何孤立密码条目,其中用户无论出于何种原因都懒得继续注册,但确实提交了错误的表单,至少一次。

我无法立即看出这将如何以任何方式损害安全性。

另一种方法是使用多步骤表单,并在最后一步自行输入密码和密码确认。这样,您可以确保其余数据在用户达到密码阶段时有效,并且如果他们的密码有任何错误(例如密码和密码确认不匹配),那么您可以争辩说它是然后将两个字段都设为空白是合理的,因为用户将无法轻松解决密码被遮盖的问题。

于 2013-10-28T10:44:19.063 回答