Отключить функцию браузера «Сохранить пароль»

423

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

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

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

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

mattsmith321
источник
6
Вы должны предоставить greasemonkey-script, чтобы люди могли снова включить его. Я не думаю, что пользователям нравится заставлять вводить пароль каждый раз ...
ThiefMaster
14
Этот вопрос заслуживает одобрения за то, что он полезен и понятен. С другой стороны, я не хочу, чтобы люди находили решение этой «проблемы».
Ян Бойд
11
Это не всегда "проблема". Я пришел сюда, потому что Firefox предлагает сохранить пароль для формы, которая содержит пароль WiFi / SSID, а не форму имени пользователя / пароля для входа. Это очень раздражает, и я хочу остановить это.
SRD
1
Если информация настолько важна, она должна быть защищена не только паролем.
Сэм Уоткинс
Один способ, которым это работает, - не использовать <form>. Если вы используете JavaScript для отправки данных (XHR), то вам это не нужно. Я хотел отключить в системе, которая использует аутентификацию «одноразовый пароль» (нет причин хранить его). Для аутентификации пользователя / пароля я бы не рекомендовал отключать эту функцию.
Лепе

Ответы:

322

Я не уверен, что это будет работать во всех браузерах, но вы должны попробовать установить 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, но я не оставлю никаких гарантий;)

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

Пример с jQuery:

$('#loginForm').attr('autocomplete', 'off');
Маркус Олссон
источник
48
Просто быстрый комментарий, поскольку это меняется, HTML5 добавляет атрибут autocomplete в спецификацию, так что теперь он действителен.
Тайлер Эджето
11
Просто FYI, Microsoft решила больше не будет , что Internet Explorer 11 честь autocomplete="off"для input type="password"полей. msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx
JW Lim
6
Так же, как @JWLim упомянул в IE 11 отказ от поддержки функции сохранения пароля, так и в Firefox. bugzilla.mozilla.org/show_bug.cgi?id=956906
Грегори Космо Haun
3
Firefox (к сожалению) последовал примеру Microsoft и «убрал» поддержку автозаполнения. Для получения дополнительной информации см. Комментарий 100 в следующем обсуждении проблемы: bugzilla.mozilla.org/show_bug.cgi?id=956906
Отскакивающий бит
8
Теперь не работает для Firefox 38+ mozilla.org/en-US/firefox/38.0/releasenotes
Иллюминатор
44

Вдобавок к

autocomplete="off"

использование

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

для входных данных, которые вы не хотите, чтобы они запоминали данные формы ( 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и т.д. , и работает как шарм. Надеюсь это поможет.

Мурат Йылдыз
источник
2
@Murat Yıldız: Я должен реализовать то же самое, и я следовал вашему коду. Он отлично работает во всех браузерах. Спасибо !
Шри
1
@Sree Я рад, что это было полезно для вас :)
Мурат Йылдыз
3
Только что протестировал Mozilla Firefox 52.0 , Google Chrome 57.0 , Microsoft Edge 38.1 и работает как шарм! ..
Murat Yıldız
1
Там может быть ошибка в Safari мобильны , как этот ответ фиксирует его stackoverflow.com/questions/2530/...
FERIE
1
Windows Firefox 57.0.2 (64-разрядная версия) все еще предлагает сохранить пароль после того, как я это реализовал.
Пану
37

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

С этим требованием стандартный 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>
Майк Стоун
источник
1
Это выглядит как хорошее решение. Это имеет смысл, поскольку отправляемая вами форма сама по себе не содержит пароля. Я полагаю, что вы можете иметь две формы, первую, чтобы убедиться, что имя пользователя и пароль видны во всех браузерах.
Алексис Уилке
3
Мне нравится ваше решение и реализовано подобное на моем сайте, просто смешно, что на сегодняшний день браузеры не предлагают простой способ решить эту проблему.
AgelessEssence
Не уверен, что это потому, что я застрял, используя jquery 1.6, но вышеупомянутый jquery работал только после переноса внутри $ (document) .ready (function () {});
rgbflawed
Единственное правильное решение - это то, что некоторые браузеры больше не принимают autocomplete = "off"!
Абадис
1
Я только что попробовал этот метод на Chrome, Opera и Internet Explorer, и он, кажется, работает, но он не работает с Firefox не зря
Ченкс
29

Ну, это очень старый пост, но все же я дам свое решение, которого моя команда пыталась достичь долгое время. Мы просто добавили новое поле ввода 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;}
whyAto8
источник
1
Одним из преимуществ этого способа по сравнению с теми, кто использует скрытые входы, является то, что таким образом пароль никогда не сохраняется в текстовом поле
pvgoddijn
@ whyAto8 Это не сработало для меня в Chrome 47.0.2526.111 ... хитрость, чтобы заставить его работать, состояла в том, чтобы добавить еще один текст поля в скрытый div. Браузер просит сохранить пароль, НО в нем написано "Вы уверены, что сохранили эти данные?" а затем он показывает пустое имя пользователя и пустой пароль. Это сработало.
Дэвид Беланджер
1
Решение WhyAto8 вместе с комментарием @David Bélanger работало для меня (ни одно из других решений не помогло). Я должен также упомянуть, что я добавил два пустых скрытых поля ДО тех, которые фактически использовались для ввода данных, и дублированные (скрытые) поля имели одинаковые соответствующие имена. Таким образом, Chrome (48.0.2564.103) даже не спрашивал, нужно ли сохранять какой-либо пароль.
Вадим
Никакая комбинация этого не работает на Chrome 48.0.2564.116. Даже в сочетании с комментарием DavidBelanger, всплывающее окно Chrome с просьбой сохранить пароль все равно кэширует пароль, если вы нажмете «ОК»
ChrisO
Отличный ответ .. Только, пожалуйста, скажите, пожалуйста, почему вы сказали «Убедитесь, что этот div находится перед фактическим вводом пароля» ? Я вставил этот div после фактического ввода пароля, и он все еще работает .. Так почему вы упомянули это?
Мартин Эй Джей
16

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

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

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

Джоэл Коухорн
источник
5
[@Joel] (# 32409), который может помешать автоматическому заполнению формы, но не будет ли браузер запрашивать сохранение пароля для этой предполагаемой новой формы?
Джозеф Пекораро
3
Я не верю, что это сработает сейчас. В FF 13 у меня есть форма с несколькими полями пароля, все с разными именами. FF, как только он сохраняет пароль для этой страницы, вставляет сохраненный пароль во ВСЕ поля пароля. Неважно, как называются поля (у меня есть, например, «new_password» и «old_password», и сохраненный пароль сбрасывается в оба). В этой конкретной форме у меня нет имени пользователя для сохранения пароля - только два поля пароля, на случай, если что-то изменится.
Джейсон
1
Кивает @Jason, давая поле пароля новый UUID для имени каждый раз, и это ничего не делает для победы над попытками браузера его заполнить.
FP Freely
14

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

Дэвид Шмитт
источник
2
Кстати, это аутентификация, а не аутентификация
Джонатан.
26
@Jonathan Жаль, я предпочитаю аутентификацию
Ян Бойд
Другим решением может быть реализация JavaScript, который принудительно закрывает браузер после выхода пользователя из приложения. Это очистит всю память браузера, и, следовательно, никакие данные не могут быть извлечены из памяти браузера.
Аджай Такур
13

Самый чистый способ - использовать autocomplete="off"атрибут tag, но 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 после соответствующего «имени пользователя» вход.

venimus
источник
Какой смысл запрещать браузеру вводить пароль, но разрешать хранить его? Это лишь заставляет пользователя думать, что его пароль не хранится, пока он на самом деле уязвим.
CodesInChaos
Таким образом, он не будет хранить ваш пароль, потому что вы вводите в другое поле, которое игнорируется FF. Вместо этого он будет хранить пустую строку.
Венимус
@CodesInChaos ИМХО вам следует пересмотреть свое отрицательное мнение, потому что ваше беспокойство недействительно
venimus
12

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

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

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

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

Обновлено 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();
 }
}

Удачи!!!

Asik
источник
Хотя этот ответ предоставляет полезную информацию, он на самом деле не отвечает на вопрос о том, как запретить браузерам сохранять пароли.
JW Lim
@JW Лим, я обновил ответ. Пожалуйста, посмотрите на это. Спасибо!
Асик
@Sivakumar, Хорошо, пожалуйста, включите ОС и версию Safari. так что другие люди знают об этом. это работало в моей системе (Windows 8, Safary 5)
Asik
@Asik Safari 8.0.3 и Mac OS 10.10
Sivakumar
7

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

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

Джейсон Бантинг
источник
10
Вы должны помнить, что это правительственный сайт, и такие вещи политически заряжены. Если кто-то наверху говорит: «Это не должно работать так», то, что реально, не является частью уравнения. Проблема может быть перенесена в заметки Post-It, но политика в отношении них предназначена для другого отдела - проблема была перенесена ;-) И я на самом деле серьезно.
Джейсон
6

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

Пример jQuery:

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

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

Говард Янг
источник
3

если autocomplete = "off" не работает ... удалите тег формы и используйте вместо него тег div, а затем передайте значения формы с помощью jquery на сервер. Это сработало для меня.

Нихил Динеш
источник
3

Поскольку autocomplete = "off" не работает для полей пароля, нужно полагаться на javascript. Вот простое решение, основанное на ответах, найденных здесь.

Добавьте атрибут data-password-autocomplete = "off" в поле вашего пароля:

<input type="password" data-password-autocomplete="off">

Включить следующие JS:

$(function(){
    $('[data-password-autocomplete="off"]').each(function() {
        $(this).prop('type', 'text');
        $('<input type="password"/>').hide().insertBefore(this);
        $(this).focus(function() {
            $(this).prop('type', 'password');
        });
    });     
});

Это решение работает как для Chrome, так и для FF.

mfernandes
источник
Windows Firefox 57.0.2 (64-разрядная версия) все еще предлагает сохранить пароль после того, как я это реализовал.
Пану
2

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

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

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

У меня есть работа вокруг, которая может помочь.

Вы можете сделать собственный хак шрифта. Поэтому создайте собственный шрифт, например, со всеми символами в виде точки / круга / звезды. Используйте это как собственный шрифт для вашего сайта. Проверьте, как это сделать в Inkscape: как сделать свой собственный шрифт

Тогда в вашем логине используйте:

<form autocomplete='off'  ...>
   <input type="text" name="email" ...>
   <input type="text" name="password" class="password" autocomplete='off' ...>
   <input type=submit>
</form>

Затем добавьте свой CSS:

@font-face {
    font-family: 'myCustomfont';
    src: url('myCustomfont.eot');
    src: url('myCustomfont?#iefix') format('embedded-opentype'),
         url('myCustomfont.woff') format('woff'),
         url('myCustomfont.ttf') format('truetype'),
         url('myCustomfont.svg#myCustomfont') format('svg');
    font-weight: normal;
    font-style: normal;

}
.password {
  font-family:'myCustomfont';
}

Довольно кросс-браузер совместим. Я пробовал IE6 +, FF, Safari и Chrome. Просто убедитесь, что конвертируемый шрифт oet не поврежден. Надеюсь, поможет?

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

Самый простой способ решить эту проблему - поместить поля INPUT вне тега FORM и добавить два скрытых поля внутри тега FORM. Затем в прослушивателе события submit перед отправкой данных формы на сервер скопируйте значения из видимого ввода в невидимые.

Вот пример (вы не можете запустить его здесь, поскольку действие формы не настроено на сценарий реального входа):

<!doctype html>
<html>
<head>
  <title>Login & Save password test</title>
  <meta charset="utf-8">
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
</head>

  <body>
      <!-- the following fields will show on page, but are not part of the form -->
      <input class="username" type="text" placeholder="Username" />
      <input class="password" type="password" placeholder="Password" />

      <form id="loginForm" action="login.aspx" method="post">
        <!-- thw following two fields are part of the form, but are not visible -->
        <input name="username" id="username" type="hidden" />
        <input name="password" id="password" type="hidden" />
        <!-- standard submit button -->
        <button type="submit">Login</button>
      </form>

    <script>
      // attache a event listener which will get called just before the form data is sent to server
      $('form').submit(function(ev) {
        console.log('xxx');
        // read the value from the visible INPUT and save it to invisible one
        // ... so that it gets sent to the server
        $('#username').val($('.username').val());
        $('#password').val($('.password').val());
      });
    </script>

  </body>
</html>

коленно-колы
источник
Windows Firefox 57.0.2 (64-разрядная версия) все еще предлагает сохранить пароль после того, как я это реализовал.
Пану
ну, это был просто взлом, который может перестать работать в любое время :)
колено
это лучший вариант! просто очистите поле пароля перед отправкой: $ ('. password'). val ('')
ebelendez
2

Мой обходной путь js (jquery) - изменить тип ввода пароля на текст в форме отправки . Пароль может стать видимым на секунду, поэтому я также скрываю ввод непосредственно перед этим. Я бы предпочел не использовать это для форм входа в систему , но это полезно (вместе с autocomplete = "off"), например, внутри административной части сайта.

Попробуйте поместить это в консоль (с помощью jquery), прежде чем отправлять форму.

$('form').submit(function(event) {
    $(this).find('input[type=password]').css('visibility', 'hidden').attr('type', 'text');
});

Протестировано на Chrome 44.0.2403.157 (64-разрядная версия).

ovalek
источник
1
Это на самом деле работает. Это предотвращает сохранение пароля браузером. Чтобы не показывать пароль, вы можете заключить поле ввода в скрытый элемент div. И вы уже можете сделать это, если DOM загружен, не нужно ждать, пока вы отправите форму.
Паром Краненбург
Работает на IE 11.0.9600.18161!
Lu55
Это правда. Теперь я попробовал это в FF 44.0.2, и этот хак больше не работает ... какой позор. В Chrome это все еще работает.
ovalek
Вы можете заменить ввод [type = submit] или кнопку [type = submit] обычной кнопкой [type = button] и сделать это в обработчике onclick. Если в форме нет [type = submit], это также предотвратит отправку формы с ключом ввода и запросом сохранения пароля.
Стивен Дон
2

Я проверил много решений. Динамическое имя поля пароля, несколько полей пароля (невидимых для поддельных), изменение типа ввода с «текст» на «пароль», autocomplete = «off», autocomplete = «new-password», ... но ничего не решило с недавними браузер.

Чтобы избавиться от пароля, запомните, я наконец обработал пароль как поле ввода и «размыл» набранный текст.

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

Вам нужно будет оценить риск использования предложенного ниже предложения и опции запоминания пароля из навигатора.

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

В моем случае это ERP, работающий на общих компьютерах, поэтому я попытаюсь найти решение ниже.

<input style="background-color: rgb(239, 179, 196); color: black; text-shadow: none;" name="password" size="10" maxlength="30" onfocus="this.value='';this.style.color='black'; this.style.textShadow='none';" onkeypress="this.style.color='transparent'; this.style.textShadow='1px 1px 6px green';" autocomplete="off" type="text">
Седрик Саймон
источник
1

Маркус поднял замечательную мысль. Я решил посмотреть autocompleteатрибут и получил следующее:

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

Поэтому я должен сказать, что хотя он не работает на 100% по всем направлениям, он обрабатывается в основных браузерах, поэтому это отличное решение.

Джозеф Пекораро
источник
У меня есть эта проблема проверки в соответствии со стандартами W3C. Дело в том, что я хочу эту функциональность для сайта мобильного банкинга. Я предполагаю, что мобильные браузеры достаточно строги и могут иногда испортить форму, если используется какой-то недопустимый атрибут. Что вы рекомендуете в этом случае?
просит
2
Я думаю, что это старый стиль мышления. Многие современные мобильные браузеры построены на основе WebKit и либо поддерживают, либо изящно игнорируют этот атрибут. Я не знаю, как другие страны или браузеры в старых сотовых телефонах справляются с этим, но изящная обработка атрибутов / элементов, которые не известны, является фундаментальной для хорошего браузера. Это «будущее доказывает», что браузер не сломается по мере развития сети. Он может отставать (не реализовывать новые функции), но не сломается. Надеюсь, это поможет =)
Джозеф Пекораро
1
Это должен быть скорее комментарий к указанному ответу, чем ответ на сам вопрос.
viam0Zah
1

Я пробовал выше, autocomplete="off"и все же ничего удачного. Если вы используете Angle JS, я рекомендую нажать кнопку и нажать нг.

<button type="button" class="" ng-click="vm.login()" />

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

Спасибо за вопрос и ответы.

Ласита Бенарагама
источник
это, очевидно, нарушает нажатие клавиши enterили returnдля отправки формы.
8eecf0d2
0

Один из известных мне способов - использовать (например) JavaScript для копирования значения из поля пароля перед отправкой формы.

Основная проблема заключается в том, что решение связано с JavaScript.

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

Huppie
источник
Хеширование на стороне клиента не заменяет хеширование на стороне сервера. Я не уверен относительно того, будет ли это какой-либо помощью (если сделано дополнительно).
Brilliand
2
Разрешение хеширования на стороне клиента опасно, поскольку это означает, что злоумышленнику не нужно взламывать пароль из хеша, он может просто использовать хеш для входа в систему. Хеш становится эквивалентным паролю.
Rjmunro
Я согласен с Brillia и в том, что хеш на клиенте полезен, только если у вас есть хеш на сервере до сохранения пароля в вашей базе данных. Однако наличие хеша на стороне клиента может помочь определенному количеству проблем с мужчинами в середине. При этом, поскольку код будет доступен (по крайней мере, на общедоступных сайтах) хакерам, он, вероятно, не так полезен, как может показаться.
Алексис Уилке
0

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

Представьте, что у вас есть autocomplete = "off", отлично работающий во всех браузерах. Это поможет с безопасностью? Конечно нет. Пользователи будут записывать свои пароли в учебниках, на наклейках, прикрепленных к монитору, где их может увидеть каждый посетитель офиса, сохранять их в текстовые файлы на рабочем столе и так далее.

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

Так что либо у вас есть какая-то сумасшедшая политика безопасности с аппаратными ключами (например, некоторые банки предлагают интернет-банкинг, который в основном использует двухфакторную аутентификацию), либо БЕЗ БЕЗОПАСНОСТИ в принципе. Ну, это, конечно, немного преувеличено. Важно понять, от чего вы пытаетесь защитить:

  1. Несанкционированный доступ. Простая форма входа в систему достаточно в принципе. Иногда принимаются дополнительные меры, такие как случайные вопросы безопасности, CAPTCHA, усиление пароля и т. Д.
  2. Учетные данные нюхают. HTTPS ОБЯЗАН, если люди получают доступ к вашему веб-приложению из общедоступных точек доступа Wi-Fi и т. Д. Отметьте, что даже имея HTTPS, ваши пользователи должны регулярно менять свои пароли.
  3. Инсайдерская атака. Существует два таких примера, начиная с простого кражи ваших паролей из браузера или тех, которые вы записали где-то на столе (не требует никаких навыков в области ИТ) и заканчивая фальсификацией сеансов и перехватом трафика локальной сети (даже зашифрованного) и дальнейший доступ к веб-приложению, как будто это был другой конечный пользователь.

В этом конкретном посте я вижу неадекватные требования к разработчику, которые он никогда не сможет решить из-за характера проблемы - безопасности конечного пользователя. Моя субъективная точка зрения заключается в том, что разработчик должен сказать «НЕТ» и указать на проблему требований, а не тратить время на такие задачи, если честно. Это не обязательно делает вашу систему более безопасной, скорее это приведет к случаям с наклейками на мониторах. К сожалению, некоторые боссы слышат только то, что хотят услышать. Однако, если бы я был вами, я бы попытался объяснить, откуда возникла настоящая проблема, и что autocomplete = "off" не решит ее, если только это не заставит пользователей хранить все свои пароли исключительно в своей голове! Разработчик со своей стороны не может полностью защитить пользователей,

ruruskyi
источник
0

Столкнувшись с той же проблемой HIPAA и нашел относительно простое решение,

  1. Создайте скрытое поле пароля с именем поля в виде массива.

    <input type="password" name="password[]" style="display:none" />
    
  2. Используйте тот же массив для поля фактического пароля.

    <input type="password" name="password[]" />
    

Браузер (Chrome) может предложить вам «Сохранить пароль», но независимо от того, выберет ли пользователь сохранение, при следующем входе в систему пароль автоматически заполнит поле скрытого пароля, нулевой слот в массиве, оставив 1-й слот пустым.

Я попытался определить массив, такой как «пароль [part2]», но он все еще помнил. Я думаю, что он отбрасывает его, если это неиндексированный массив, потому что у него нет выбора, кроме как отбросить его в первую очередь.

Затем вы используете ваш язык программирования для доступа к массиву, например, PHP,

echo $_POST['password'][1];
Майк
источник
1
При этом вы скрываете проблему безопасности - хэш пароля все еще хранится в кэше браузера.
Александр Буракевич
1
Не могли бы вы уточнить? Пароль будет отправлен в виде простого текста с использованием POST. Насколько я прочитал, запросы POST не могут быть кэшированы. Вы говорите, что есть альтернатива использованию POST для отправки данных? Или вы говорите, что пароль хранится в браузере, потому что он не хранит пароль, а пустое значение в начале массива, вы тестировали этот метод?
Майк
0

Так как большинство из autocompleteпредложений, в том числе общепринятом ответ, не работают в современных веб - браузеров (например , веб - браузер менеджеры паролей игнорируют autocomplete), более новым решением является своп между passwordи textтипами и сделать цвет фона под цвет текста , когда поле является текстовым полем, которое продолжает скрывать пароль, будучи реальным паролем, когда пользователь (или программа, подобная KeePass) вводит пароль. Браузеры не просят сохранять пароли, которые хранятся в текстовых полях.

Преимущество этого подхода заключается в том, что он допускает постепенное улучшение и, следовательно, не требует Javascript для поля, функционирующего как поле обычного пароля (вместо этого можно также начать с простого текстового поля и применить тот же подход, но это не совсем HIPAA). PHI / PII-совместимый). Кроме того, этот подход не зависит от скрытых форм / полей, которые необязательно могут быть отправлены на сервер (потому что они скрыты), и некоторые из этих приемов также не работают в некоторых современных браузерах.

Плагин jQuery:

https://github.com/cubiclesoft/php-flexforms-modules/blob/master/password-manager/jquery.stoppasswordmanager.js

Соответствующий исходный код по ссылке выше:

(function($) {
$.fn.StopPasswordManager = function() {
    return this.each(function() {
        var $this = $(this);

        $this.addClass('no-print');
        $this.attr('data-background-color', $this.css('background-color'));
        $this.css('background-color', $this.css('color'));
        $this.attr('type', 'text');
        $this.attr('autocomplete', 'off');

        $this.focus(function() {
            $this.attr('type', 'password');
            $this.css('background-color', $this.attr('data-background-color'));
        });

        $this.blur(function() {
            $this.css('background-color', $this.css('color'));
            $this.attr('type', 'text');
            $this[0].selectionStart = $this[0].selectionEnd;
        });

        $this.on('keydown', function(e) {
            if (e.keyCode == 13)
            {
                $this.css('background-color', $this.css('color'));
                $this.attr('type', 'text');
                $this[0].selectionStart = $this[0].selectionEnd;
            }
        });
    });
}
}(jQuery));

Демо-версия:

https://barebonescms.com/demos/admin_pack/admin.php

Нажмите «Добавить запись» в меню, а затем прокрутите вниз страницы до «Модуль: Остановить менеджер паролей».

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

CubicleSoft
источник
-1

Есть ли у сайта способ сказать браузеру не предлагать запоминать пароли?

Сайт сообщает браузеру, что это пароль с помощью <input type="password">. Поэтому, если вы должны сделать это с точки зрения веб-сайта, вам придется это изменить. (Очевидно, я не рекомендую это).

Лучшее решение - настроить браузер так, чтобы он не запоминал пароли.

Джозеф Пекораро
источник
3
Почему очевидно, что вы не рекомендуете менять поле ввода? Разработка вопросов безопасности будет полезна.
Карл
1
@karl: потому что необходимость вводить пароль в открытом доступе позволяет «серфить по плечу», процесс сбора пароля, глядя на экран во время его ввода.
Дэвид Шмитт
Не только серфинг по человеческому плечу, но и шпионское ПО или вирусы могут наблюдать за вашим экраном и видеть, что было напечатано в текстовых полях.
Карл
6
@karl: Если на вашем компьютере есть шпионское ПО или вирус, никакая защита от звездочек не спасет вас. Установленному приложению не сложнее перехватить то, что вводится в поле «пароль», чем сделать то же самое для обычного текстового поля.
Маркус Олссон
3
Кроме того, если браузер видит обычный текстовый ввод вместо ввода пароля, он, скорее всего, сохранит пароль в базе данных автозаполнения формы вместо базы данных паролей ... и затем предложит его или даже автозаполнит на каком-то не связанном веб-сайте! Таким образом, вы на самом деле даже хуже, чем когда вы начали.
Звол
-1

Если вы не хотите доверять флагу автозаполнения, вы можете убедиться, что пользователь вводит текст в поле, используя событие onchange. Код ниже представляет собой простую форму HTML. Скрытый элемент формы password_edited начинается с 0. Когда значение пароля изменяется, JavaScript в верхней части (функция pw_edited) меняет значение на 1. Когда кнопка нажата, она проверяет код valueenter здесь перед отправкой формы , Таким образом, даже если браузер игнорирует вас и автоматически заполняет поле, пользователь не может пройти страницу входа в систему, не введя в поле пароля. Кроме того, не забудьте очистить поле пароля, когда фокус установлен. В противном случае, вы можете добавить символ в конце, затем вернуться и удалить его, чтобы обмануть систему. Я рекомендую дополнительно добавить autocomplete = "off" к паролю, но этот пример показывает, как работает код резервной копии.

<html>
  <head>
    <script>
      function pw_edited() {
        document.this_form.password_edited.value = 1;
      }
      function pw_blank() {
        document.this_form.password.value = "";
      }
      function submitf() {
        if(document.this_form.password_edited.value < 1) {
          alert("Please Enter Your Password!");
        }
        else {
         document.this_form.submit();
        }
      }
    </script>
  </head>
  <body>
    <form name="this_form" method="post" action="../../cgi-bin/yourscript.cgi?login">
      <div style="padding-left:25px;">
        <p>
          <label>User:</label>
          <input name="user_name" type="text" class="input" value="" size="30" maxlength="60">
        </p>
        <p>
          <label>Password:</label>
          <input name="password" type="password" class="input" size="20" value="" maxlength="50" onfocus="pw_blank();" onchange="pw_edited();">
        </p>
        <p>
          <span id="error_msg"></span>
        </p>
        <p>
          <input type="hidden" name="password_edited" value="0">
          <input name="submitform" type="button" class="button" value="Login" onclick="return submitf();">
        </p>
      </div>
    </form>
  </body>
</html>
Том
источник
-1

autocomplete = "off" не работает для отключения менеджера паролей в Firefox 31 и, скорее всего, не в некоторых более ранних версиях.

Ознакомьтесь с обсуждением этой проблемы в Mozilla: https://bugzilla.mozilla.org/show_bug.cgi?id=956906.

Мы хотели использовать второе поле пароля для ввода одноразового пароля, сгенерированного токеном. Теперь мы используем ввод текста вместо ввода пароля. :-(

Андреас Станкевич
источник
-1

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

<input type="text" style="display:none">
<input type="text" name="OriginalLoginTextBox">

<input type="password" style="display:none">
<input type="text" name="OriginalPasswordTextBox">

Это работает нормально для IE11 и Chrome 44.0.2403.107

Sheiky
источник
-2

autocomplete = "off" работает для большинства современных браузеров, но другой метод, который я успешно использовал в Epiphany (браузер на основе WebKit для GNOME), заключается в сохранении случайно сгенерированного префикса в состоянии сеанса (или в скрытом поле, которое у меня, как оказалось, было подходящая переменная уже в состоянии сеанса), и используйте ее для изменения названия полей. Крещение все еще хочет сохранить пароль, но при возврате к форме он не будет заполнять поля.

Питер Нельсон
источник
Это даже хуже, чем хранить их обычным способом, так как теперь пользователь не видит, что пароль был сохранен, не мешая злоумышленнику извлечь пароль из хранилища.
CodesInChaos,
-2

У меня не было проблем с использованием этого метода:

Используйте autocomplete = "off", добавьте скрытое поле пароля, а затем еще одно скрытое поле. Браузер пытается автоматически завершить скрытый, если он не учитывает autocomplete = "off"

Spechal
источник
-2

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

Повелитель Гуу
источник