Запретить браузеру запоминать учетные данные (пароль)

возможно ли после обработки любой формы входа в систему запретить браузеру предлагать опцию запоминания пароля?

Я знаю, что его спросили и ответили здесь, но ни один из ответов не работал до сих пор, даже один из них предложил использовать:

autocomplete="off"

но это также не сработало.

Я использую AngularJS и Jade в качестве шаблонного движка (не уверен, уместно ли это или нет), есть ли способ сделать это?

6 ответов


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

https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion

вы также должны установить autocomplete="off" на ваш вклад в как и твоя форма.

примечания к выпуску Google Chrome:

пользовательский интерфейс Google Chrome для автозаполнения запроса варьируется в зависимости от того, установлен ли автозаполнение на элементы ввода, а также их форму. В частности, когда форма и автозаполнение выключено и поля автозаполнения его вход элемента не задан, то если пользователь запрашивает предложения автозаполнения для ввода элементов, хрома может появиться сообщение "автозаполнение отключено форма."С другой стороны, если и форма, и элемент ввода имеют значение автозаполнения off, браузер не будет отображать это сообщение. По этой причине вы должны установить автозаполнение в off для каждого ввода, который имеет пользовательское автозаполнение.


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

например. (код psuedo, точный синтаксис зависит от того, используете ли вы PHP, jQuery, чистый Javascript и т. д.)

<script>
var number = Math.random();
var login_name = 'name_'+number;
var pass_word = 'pass_'+number;
</script>
<input name='number' value="number" type='hidden'>
<input name="login_name" type='text'>
<input name="pass_word" type='password'>

ваш сервер считывает поле" number", а затем использует его для чтения значения"name_ "и"pass_".

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


Это очень неприятная проблема для меня как разработчика. Проблема в том, что, хотя я понимаю "раздражение" пользователя в том, что его браузер не может запомнить свой пароль, и я не хочу "отключить" эту функцию полностью, бывают случаи, когда я хочу отключить ее только для определенного поля пароля. Пример для меня-диалоговое окно "сбросить пароль". Я хочу заставить их повторно ввести свой старый пароль, а затем, конечно, ввести новый дважды. Ну, это был мой опыт, что независимо от того, что я называю этот "старый" ввод пароля, он автоматически заполняется "запоминающимся" паролем (в Firefox 49.0.1 в любом случае). Возможно, здесь я ошибаюсь, но это был мой опыт, он просто заполняет его независимо от того, что имя этого ввода отличается от поля ввода "вход". Поведение, которое я вижу, в основном заключается в том, что браузер, похоже, говорит: "этот пользователь запомнил пароль для этого сайта, поэтому теперь просто заполните каждый" ввод type= 'password '" поле с этим паролем независимо от имени. Мне кажется, что это должно быть основано на атрибуте "name", но для меня (на нескольких сайтах, над которыми я работал) это просто не так.

мое решение:

  1. цвет этого поля пароля того же цвета, что и фон вашего ввода, поэтому "точки пароля" по существу невидимы при загрузке страницы.
  2. onload, onblur, после тайм-аута или как вы хотите это сделать, используйте JQuery или JS, чтобы установить значение этого поля пароля в nothing (пустое), затем установите цвет поля в то, что он должен быть.

    $("#old_password").val('').css('color','black);
    

поскольку вы используете AngularJS, вы можете оставить поле без имени и получить доступ к содержащимся в нем данным через модель:

Login: <input ng-model="login" type="text" />
Password: <input ng-model="password" type="password" autocomplete="off" />

и в вашем файле javascript:

$scope.doLogin = function() {
    var dataObj = {
        login: $scope.login,
        password: $scope.password
    };
    var res = $http.post('/login', dataObj);
}

протестировано в IE10 и Chrome 54


этот пост немного устарел, но поскольку я нашел решение, которое работает для меня (по крайней мере, с версией Chrome 56), я поделюсь им здесь.

если убрать name и password атрибуты input, то Chrome не будет просить сохранить пароль. Затем вам просто нужно добавить недостающие атрибуты кодом непосредственно перед отправкой формы:

<!-- Do not set "id" and "name" attributes -->
Login: <input type="text">
Password: <input type="password">
<!-- Handle submit action -->
<input type="submit" onclick="login(this)">

затем в Javascript:

function login(submitButton) {
    var form = submitButton.form;
    // fill input names by code before submitting
    var inputs = $(form).find('input');
    $(inputs[0]).attr('name', 'userName');
    $(inputs[1]).attr('name', 'password');
    form.submit();
}

надеюсь, это поможет. Протестировано только на Chrome 56.


Я обнаружил, что Firefox 52.0.2 невероятно настроен запоминать значения автозаполнения. Я попробовал почти все, что было предложено выше, включая изменение атрибутов имени на случайные значения. Единственное, что работает для меня, это установка значений "" с Javascript после того, как браузер добился своего с формой.

мой вариант использования удачлив в том, что мне не нужно прибегать к трюкам CSS, чтобы предотвратить запутанную и / или раздражающую вспышку автозаполненных значений формы (как предложено @MinnesotaSlim выше), потому что моя форма скрыта, пока они не нажмут кнопку; затем она отображается через модальный загрузчик. Отсюда (с jQuery),

$('#my-button').on("click",function(){        
   $('#form-login input').val("");
});
// this also works nicely
$('#my-modal').on("show.bs.modal",function(){
    $('#form-login input').val("");
})

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