2013-10-28 2 views
1

С simple_form жемчужину рельса:Rails simple_form запомнить ввод пароля

Если у меня есть = f.input :password, :required => true тогда, когда я отправить форму и содержит ошибки, мой ввод пароля ушел на перезагрузки страницы. Если я использую = f.input :password, :required => true, :as => :text, все работает так, как ожидалось, поэтому ясно, что для полей пароля существует другая обработка.

Как запомнить значения для полей пароля?

EDIT: некоторые люди, похоже, не понимают, что я говорю о повторной рекламе той же формы со значениями, которые были введены ранее. Этот вопрос НИЧЕГО не связан с базой данных, ведь в этом сценарии ничего не сохраняется даже в базе данных. Для людей PHP это эквивалент <input name="pass" type="password" value="<?= $_POST['pass']; ?>">

+1

u не должен помнить значения для полей подтверждения пароля или пароля. они должны заполняться явным образом каждый раз. –

+0

Ответ на мою проблему по-прежнему интересует меня. Во всяком случае, почему я не должен помнить значения для полей пароля? – Silex

+1

пароли не хранятся в браузере с его конфиденциальной информации. см. http://stackoverflow.com/questions/3040731/should-autocomplete-off-be-used-for-all-sensitive-fields –

ответ

4

О вопросе, ответ заключается в использовании 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 } %> 

О вторичной теме на возвращающей значение пароля, после того, как investiguation это действительно больше как дополнительный небольшой бугорок безопасности , Реальная безопасность осуществляется с помощью HTTPS или путем того, что хеширование пароля выполняется на стороне клиента с помощью javascript, так что сервер даже не знает о пароле.

Для примера, даже такие веб-сайты, как https://github.com/join, похоже, делают это так, как я это делаю (введите пароль, но введите недействительный адрес электронной почты и увидите, что пароль заполняется как простой элемент HTML value).

Соответствующий маршрут и контроллер может выглядеть следующим образом:

routes.rb:

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

registrations_controller.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 
+1

от 27 января 2015 года, github, похоже, не делает этого так, как вы предлагали. Github заставляет вас повторно ввести пароль и подтверждение после того, как вы отправили форму, которая недействительна. – Magne

1

Я не знаю точно, как Rails справляется с этим, но если бы я писал это вручную, скажем в PHP, то чтобы получить введенные данные формы обратно в форму, после ошибки проверки, тогда мне пришлось бы вернуть данные в атрибут значения каждого входа.

Нет ничего технически мешающего мне делать это с помощью ввода пароля, но это означало бы, что я должен был бы передать им свой собственный пароль в виде обычного текста. Это, я думаю, является нарушителем транзакций, потому что это дает еще одну возможность для перехвата пароля.

После прочтения этой темы кажется, что многие люди считают это также формой «хранения» пароля в виде простого текста, который явно плох. Однако мне совершенно не ясно, почему это считается «сохранением» пароля, поскольку серверу явно не нужно было бы хранить текстовый пароль в любом месте, кроме того, в той же самой переменной, которая использовалась для получения пароля обычного текста в первое место. Однако может случиться так, что они означают, что пароль хранится в ответе HTTP, что по сути является той же проблемой, что и выше.

Другая причина, по которой я видел, - это то, что для вставки пароля обратно в ввод пароля потребуется использовать атрибут value. Хотя это будет затенять пароль на визуализированном входе, пароль будет отображаться при проверке источника, например, Firebug. Для меня это не проблема, потому что тривиально превращать тип ввода с паролем в текст и вскрыть пароль в любом случае или просто использовать JS. Абсолютно некорректно думать, что поле пароля обеспечивает много встроенной безопасности, затеняя пароль визуально.

Что вы можете сделать, это:

  1. Хэш пароля (предполагая это, сам, проходит валидация) и хранить, что даже если остальная часть данных не проходит проверку
  2. Отключение пароля поля на возвращаемый формы или иным образом указывать пользователю, что пароль, который они отправили, был принят, но остальная часть данных формы должна быть исправлена.
  3. Опционально, чтобы пользователь мог повторно активировать поля пароля, если они решили, что им нужен другой пароль.
  4. Запустите задачу cron, которая регулярно очищает базу данных любых потерянных паролей, когда пользователь по какой-либо причине не удосужился продолжить регистрацию, но подал форму с ошибками, по крайней мере, один раз.

Я не могу сразу увидеть, как это может скомпрометировать безопасность.

Другим подходом было бы иметь многоступенчатую форму и иметь входные данные для ввода пароля и пароля самостоятельно на последнем шаге. Таким образом, вы можете гарантировать, что остальная часть данных действительна к моменту достижения пользователем пароля и если у них есть какие-либо ошибки в их паролях (например, пароль и подтверждение пароля не совпадают), вы можете утверждать, что это разумно затем сделать оба поля пустым, так как пользователь не сможет легко устранить проблему с закрытыми паролями.

+0

О безопасности: они уже дали мне свой пароль в виде обычного текста. Это соображение безопасности действительно похоже на раскалывание волос. Я согласен, что это немного уменьшает * проблемы с безопасностью, но, честно говоря, если кто-то может перехватить ответ на веб-сайт и сыграть мужчину в середине, у вас уже есть гораздо большие проблемы. Также речь идет не о том, как технически делать то, что я прошу в HTML, но как настроить поведение плагина 'simple_form' в отношении полей пароля. – Silex

+1

@ Силекс Я согласен с тем, что это похоже на расщепление волос и с вашим ответом на то, что HTTPS уже справляется с этими проблемами. Однако, оглянувшись, я с удивлением обнаружил, что могу найти очень мало на эту тему. Я уверен, вы согласитесь, что очень часто для полей пароля не заполняется после проверки (даже если некоторые крупные сайты делают это), и даже простая форма сама по себе требует обходного пути. Интересно, действительно ли для этого есть веская причина. Я вижу, что вы открыли проблему на простой форме, и мне интересно, нет ли веских причин, почему они не должны изменять встроенное поведение? –

+0

Да, учитывая небольшое влияние этого на безопасность _risks_, я предполагаю, что это больше относится к категории «хорошей практики», чем к «нужно делать или быть уязвимым». Я был бы счастлив, если бы оказался ошибочным :) – Silex

2

Это не поведение SimpleForm, это в том, Rails обрабатывает входы типа пароля (см. http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-password_field).

SimpleForm использует рельсы password_field, который по умолчанию имеет пустое значение. API явно говорит, чтобы установить значение через параметр options.

+0

Спасибо за информацию! – Silex

Смежные вопросы