使用铁路的simple_form
宝石:
如果我有= f.input :password, :required => true
,那么每当我提交表单并且它包含错误时,我的密码输入都会在页面重新加载时消失。如果我使用= f.input :password, :required => true, :as => :text
这一切都像预期的那样有效,那么显然对密码字段的处理方式不同。
如何记住密码字段的值?
编辑:有些人似乎并不明白我在谈论用以前输入的值重新显示相同的表格。这个问题与数据库无关,事实上在这种情况下甚至没有任何东西保存在数据库中。对于PHP人员,这相当于<input name="pass" type="password" value="<?= $_POST['pass']; ?>">
答案 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是微不足道的。认为密码字段提供了很多内置安全性,除了在视觉上模糊密码之外,这是完全错误的。
你能做的是:
我无法立即看到这会如何以任何方式危及安全。
另一种方法是拥有一个多步骤表单,并在最后一步自己拥有密码和密码确认输入。这样,您可以确保在用户到达密码阶段时其余数据有效,并且如果密码中有任何错误(例如密码和密码确认不匹配),那么您可以认为它是合理然后将两个字段都空白,因为用户将无法轻易解决密码模糊的问题。