Как браузер знает, когда запрашивать пользователя для сохранения пароля?

Это связано с вопросом, который я задал здесь: Как заставить браузер запрашивать пароль?

В этом и заключается проблема: я НЕ МОЖЕТ получить мой браузер, чтобы он предложил мне сохранить пароль для сайта, который я разрабатываю. (Я говорю о баре, который появляется иногда, когда вы отправляете форму в Firefox, в которой говорится: "Помните пароль для сайта yoursite.com? Да/Нет сейчас/Никогда" )

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

За исключением этого случая, когда он не предлагает моим пользователям этот параметр после того, как они используют мою регистрационную форму, и это делает меня гайкой.: -)

(Я проверил настройки Firefox - я НЕ сказал браузеру "никогда" для этого сайта. Он должен запрашивать.)

Мой вопрос

Каковы эвристики, которые Firefox использует, когда они должны предлагать пользователю сохранять? Это не должно быть слишком сложно ответить, поскольку он находится прямо в источнике Mozilla (я не знаю, где искать, иначе я попытаюсь выкопать его сам). Мне также не повезло найти сообщение в блоге или другую аналогичную заметку разработчика от разработчиков Mozilla об этом.

(Мне было бы хорошо, если бы на этот вопрос ответили Safari или IE, я бы предположил, что у всех пользователей браузера очень похожие правила, поэтому, если я могу заставить его работать в одном из них, он будет работать и в других).

(* Обратите внимание, что если ваш ответ на меня имеет какое-либо отношение к файлам cookie, шифрованию или чему-либо еще, что касается того, как я храню пароли в своей локальной базе данных, шансы на то, что вы неправильно поняли мой вопрос.:-)

Ответ 1

Основываясь на том, что я прочитал, я думаю, что Firefox обнаруживает пароли с помощью form.elements[n].type == "password" (итерации по всем элементам формы), а затем обнаруживает поле имени пользователя путем поиска назад через элементы формы для текстового поля непосредственно перед полем пароля (подробнее здесь). Вы можете попробовать что-то подобное в Javascript и посмотреть, можете ли вы определить свое поле пароля.

Из того, что я могу сказать, ваша форма входа должна быть частью <form>, или Firefox не обнаружит ее. Установка id="password" в поле вашего пароля, вероятно, тоже не повредила.

Если это все еще вызывает много проблем, я бы порекомендовал просить одного из списков рассылки разработчиков проектов Mozilla (вы даже можете получить ответ от разработчика, который разработал эту функцию).

Ответ 2

У меня была та же проблема и нашел решение:

  • чтобы браузер запрашивал сохранение пароля, поля имени пользователя и пароля должны быть в форме и эта форма должна быть фактически отправлена. Кнопка submit может возвращать false из обработчика onclick (поэтому на самом деле отправка не выполняется).

  • чтобы браузер восстановил ранее сохраненный пароль, поля ввода должны существовать в основной форме HTML и не создаваться с помощью javascript динамически. Форма может быть создана с отображением: none.

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

Вилиам


Ответ 3

Вы должны посмотреть страницу "Отладка паролей Mozilla" и nsILoginManager docs для авторов расширений (только для подробных технических подробностей о том, как Firefox работает с управлением паролями). Вы можете вникать в ответы там и на другие связанные с ним страницы, чтобы узнать больше, чем вы, возможно, когда-либо хотели узнать, как менеджер паролей взаимодействует с сайтами и расширениями.

(В частности, как указано в разделе "Отладка диспетчера паролей", убедитесь, что у вас нет автозаполнения, установленного в вашем html, поскольку это приведет к подавлению приглашения на сохранение имени пользователя и пароля)

Ответ 4

Это похоже на Firefox, Chrome и Safari на Mac. Не тестировалось в Windows.

<form id="bridgeForm" action="#" target="loginframe" autocomplete="on">
    <input type="text" name="username" id="username" />
    <input type="password" name="password" id="password"/>
</form>

<iframe id="loginframe" name="loginframe" src="anyblankpage.html"></iframe>

Это нужно добавить на страницу. Он не может быть добавлен динамически. Форма и iframe могут быть установлены для отображения: none. Если вы не установите src iframe, приглашение не появится, пока вы не представите форму хотя бы один раз.

Затем вызывается форму submit():

bridgeForm.submit();

Действие может быть необязательным, и автозаполнение может быть необязательным. Не тестировали.

Примечание. В некоторых браузерах форма должна выполняться на сервере (а не в локальном хосте, а не в файловой системе), прежде чем браузер ответит.

Итак, это:

http://www.mysite.com/myPage.html

не это:

http://126.0.0.1/myPage.html
http://localhost/myPage.html
file://directory/myPage.html

Ответ 5

Работает для меня с angular, chrome, firefox: (Я искал и тестировал в течение нескольких часов - для хром был указан параметр действия формы (#). @1.21 gigawatts, спасибо! Ваш ответ был бесценен.)

Форма

firefox 30.0 - не требуется скрытая кнопка iframe и submit (как показано ниже), но для определения автозаполненных отчетов требуется директива "login-form-autofill-fix":

<form name="loginForm" login-form-autofill-fix action="#" target="emptyPageForLogin" method="post" ng-submit="login({loginName:grpEmail,password:grpPassword})">
<input type="text" name=username" id="username" ng-model="grpEmail"/>
<input type="password" name="password" id="password" ng-model="grpPassword"/>
<button type="submit">Login</button>
</form>

скрытый iframe

chrome 35.0 - не нуждается в вышеуказанной директиве, но для скрытой iframe и кнопки отправки в реальной форме требуется скрытая кнопка iframe. Скрытый iframe выглядит как

<iframe src="emptyPageForLogin.html" id="emptyPageForLogin" name="emptyPageForLogin" style="display:none"></iframe>

angular (с использованием jqLite)

Это работает с angular 1.2.18

module.directive('loginFormAutofillFix', function() { 
            return function(scope, elem, attrs) {
        if(!attrs.ngSubmit) {
            return;
        }
        setTimeout(function() {
            elem.unbind("submit").bind("submit", function(e) {
                //DO NOT PREVENT!  e.preventDefault(); 
                elem.find("input").triggerHandler("input");
                scope.$apply(attrs.ngSubmit);
            });
        }, 0);
});

поправка

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

Ответ 6

Ну, на наш сайт, поле формы с именем "имя пользователя" типа "текст", за которым сразу следует поле с именем "пароль" "и введите "пароль", похоже, делают трюк.

Ответ 7

Если вы используете логин AJAX, взгляните на этот исходный код: https://gist.github.com/968927

Он состоит из отправки формы входа в скрытый iframe, так что IE и Chrome могут обнаружить фактический логин, не перезагружая страницу.

Ответ 8

Я также заметил, что Chrome не будет предлагать запомнить пароль, если форма входа еще присутствует после запроса на вход, даже если она скрыта на странице.

Я предполагаю, что он считает, что действие входа не выполнено, и, таким образом, отказаться от хранения недопустимых учетных данных.

В браузере Chrome 34.0.

Ответ 9

Эвристика здесь довольно проста: обнаруживать поля с определенными именами в определенном порядке. Какие из них я не могу сказать, но это работало отлично для меня в Chrome и IE:

Username field: name "login", type "text";
Password field: name "password", type "password"
Submit button: element "input", type "submit". 
Element "button" type "submit" did not work.

Ответ 10

Я бы рекомендовал посмотреть исходный код Firefox. Это действительно простой код.

Методами, которые вы хотите посмотреть, являются _onFormSubmit, _getFormFields и _getPasswordFields.

Возможно, вы даже обнаружите, что проблема связана с неподтвержденной ошибкой в ​​Firefox;) https://bugzilla.mozilla.org/show_bug.cgi?id=1211780

Ответ 11

Основное ключевое слово здесь,

   <input type="password">