Отключить функцию браузера «Сохранить пароль» - PullRequest
410 голосов
/ 28 августа 2008

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

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

Вопрос : Есть ли у сайта способ запретить браузеру запоминать пароли? Я давно занимаюсь веб-разработкой, но не знаю, сталкивался ли я с этим раньше.

Любая помощь приветствуется.

Ответы [ 33 ]

319 голосов
/ 28 августа 2008

Я не уверен, что это будет работать во всех браузерах, но вы должны попробовать установить autocomplete = "off" в форме.

<form id="loginForm" action="login.cgi" method="post" autocomplete="off">

Самый простой и простой способ отключить запросы формы и хранения пароля и предотвратить кэширование данных формы в истории сеансов - использовать атрибут элемента автозаполнения со значением «off».

С http://developer.mozilla.org/En/How_to_Turn_Off_Form_Autocompletion

Некоторые незначительные исследования показывают, что это работает в IE, но я не оставлю никаких гарантий;)

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

Пример с jQuery:

$('#loginForm').attr('autocomplete', 'off');
37 голосов
/ 31 марта 2010

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

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

Наконец, я попытался просто ввести имя пользователя и пароль за пределы формы. К моему удивлению, это сработало! Он работал на IE6 и текущих версиях Firefox и Chrome на Linux. Я не тестировал его дальше, но подозреваю, что он работает в большинстве, если не во всех браузерах (но меня не удивит, если бы там был браузер, которому было бы все равно, если бы не было формы).

Вот пример кода и jQuery, чтобы заставить его работать:

<input type="text" id="username" name="username"/>
<input type="password" id="password" name="password"/>

<form id="theForm" action="/your/login" method="post">
  <input type="hidden" id="hiddenUsername" name="username"/>
  <input type="hidden" id="hiddenPassword" name="password"/>
  <input type="submit" value="Login"/>
</form>

<script type="text/javascript" language="JavaScript">
  $("#theForm").submit(function() {
    $("#hiddenUsername").val($("#username").val());
    $("#hiddenPassword").val($("#password").val());
  });
  $("#username,#password").keypress(function(e) {
    if (e.which == 13) {
      $("#theForm").submit();
    }
  });
</script>
32 голосов
/ 18 мая 2016

Просто используйте

readonly onfocus = "this.removeAttribute ('readonly');"

в дополнение к

autocomplete = "off"

к входным данным, которые вы не хотите запоминать данные формы (username, password и т. Д.), Как показано ниже:

<input type="text" name="UserName" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

<input type="password" name="Password" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

Протестировано на последних версиях основных браузеров, то есть Google Chrome, Mozilla Firefox, Microsoft Edge и т. Д. И работает как шарм. Надеюсь, это поможет ...

28 голосов
/ 04 августа 2014

Ну, это очень старый пост, но все же я дам свое решение, которого моя команда пыталась достичь долгое время. Мы просто добавили новое поле ввода type = "password" внутри формы, обернули его в div и сделали div скрытым. Убедитесь, что этот div находится перед фактическим вводом пароля. Это сработало для нас и не дало никакой опции Сохранить пароль

Plunk - http://plnkr.co/edit/xmBR31NQMUgUhYHBiZSg?p=preview

HTML:

<form method="post" action="yoururl">
      <div class="hidden">
        <input type="password"/>
      </div>
      <input type="text" name="username" placeholder="username"/>
      <input type="password" name="password" placeholder="password"/>
    </form>

CSS:

.hidden {display:none;}
16 голосов
/ 28 августа 2008

Вы можете запретить браузеру сопоставлять формы путем случайного выбора имени, используемого для поля пароля в каждом шоу. Затем браузер видит пароль для того же URL-адреса, но не может быть уверен, что это тот же пароль . Может быть, это контролирует что-то еще.

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

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

14 голосов
/ 19 декабря 2008

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

13 голосов
/ 07 октября 2013

Самый чистый способ - использовать атрибут тега autocomplete="off", но Firefox не выполняет его должным образом при переключении полей с помощью Tab.

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

<input type="text" id="username" name="username"/>
<input type="password" id="prevent_autofill" autocomplete="off" style="display:none" tabindex="-1" />
<input type="password" id="password" autocomplete="off" name="password"/>

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

Примечание: это эффективно остановит автозаполнение пароля, потому что FF «сохранит» значение #prevent_autofill (пустое) и попытается заполнить все сохраненные пароли, так как всегда использует первый type="password" ввод находит в DOM после соответствующего ввода имени пользователя.

12 голосов
/ 29 мая 2014

Я проверил, что добавление autocomplete = "off" в тег формы во всех основных браузерах. На самом деле, большинство людей в США до сих пор используют IE8.

  1. IE8, IE9, IE10, Firefox, Safari работают нормально.

    Браузер не запрашивает "сохранить пароль". Кроме того, ранее сохраненные имя пользователя и пароль не заполняются.

  2. Chrome & IE 11 не поддерживает функцию autocomplete = "off"
  3. FF с поддержкой autocomplete = "off". но иногда существующие сохраняются учетные данные заполнены.

Обновлено 11 июня 2014 г.

Наконец, ниже приведено кросс-браузерное решение с использованием javascript, и оно отлично работает во всех браузерах.

Необходимо удалить тег «form» в форме входа. После проверки на стороне клиента поместите эти учетные данные в скрытую форму и отправьте их.

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

HTML

<form id="HiddenLoginForm" action="" method="post">
<input type="hidden" name="username" id="hidden_username" />
<input type="hidden" name="password" id="hidden_password" />
</form>

Username: <input type="text" name="username" id="username" onKeyPress="return checkAndSubmit(event);" /> 
Password: <input type="text" name="password" id="password" onKeyPress="return checkAndSubmit(event);" /> 
<input type="button" value="submit" onClick="return validateAndLogin();" onKeyPress="return checkAndSubmit(event);" /> 

Javascript

//For validation- you can modify as you like
function validateAndLogin(){
  var username = document.getElementById("username");
  var password = document.getElementById("password");

  if(username  && username.value == ''){
    alert("Please enter username!");
    return false;
  }

  if(password && password.value == ''){
    alert("Please enter password!");
    return false;
  }

  document.getElementById("hidden_username").value = username.value;
  document.getElementById("hidden_password").value = password.value;
  document.getElementById("HiddenLoginForm").submit();
}

//For enter event
function checkAndSubmit(e) {
 if (e.keyCode == 13) {
   validateAndLogin();
 }
}

Удачи !!!

7 голосов
/ 28 августа 2008

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

Тогда пользователь немедленно последует совету, запишет пароль в заметке и прикрепит его к своему монитору.

6 голосов
/ 02 марта 2010

То, что я делал, это сочетание autocomplete = "off" и очистки полей пароля с использованием javascript / jQuery.

jQuery Пример:

$(function() { 
    $('#PasswordEdit').attr("autocomplete", "off");
    setTimeout('$("#PasswordEdit").val("");', 50); 
});

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

...