Rails simple_form记住密码输入

时间:2013-10-28 09:43:29

标签: ruby-on-rails simple-form

使用铁路的simple_form宝石:

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

如何记住密码字段的值?

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

3 个答案:

答案 0 :(得分:5)

关于这个问题,答案是使用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这样大的网站似乎也按照我的方式进行(填写密码但输入无效的电子邮件,并将密码作为纯HTML填充{{1} } element)。

相应的路线和控制器可能如下所示:

routes.rb:

value

registrations_controller.rb:

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

答案 1 :(得分:2)

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

SimpleForm使用rails password_field方法,默认为空值。 API明确指出要通过options参数设置值。

答案 2 :(得分:1)

我不确切知道Rails是如何处理这个的,但是如果我是用PHP手动编写的,那么在验证错误之后将输入的表单数据返回到表单中,那么我将不得不重新渲染数据进入每个输入的值属性。

技术上没有任何东西阻止我使用密码输入,但这意味着我必须以纯文本方式将自己的密码传回给他们。我认为这是一个交易破坏者,因为它为密码提供了另一个截获机会。

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

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

你能做的是:

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

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