Одна из радостей работы в государственном учреждении здравоохранения - иметь дело со всей паранойей, связанной с работой с PHI (защищенной медицинской информацией). Не поймите меня неправильно, я полностью за то, чтобы сделать все возможное, чтобы защитить личную информацию людей (здоровье, финансы, привычки к серфингу и т. д.), Но иногда люди становятся слишком нервными.
Показательный пример: один из наших государственных заказчиков недавно обнаружил, что браузер предоставляет удобную функцию для сохранения вашего пароля. Мы все знаем, что он существует уже некоторое время и является совершенно необязательным, и конечный пользователь должен решить, будет ли это разумным решением использовать или нет. Тем не менее, в настоящее время существует некоторый шум, и от нас требуют найти способ отключить эту функцию для нашего сайта.
Вопрос: Есть ли у сайта способ запретить браузеру запоминать пароли? Я давно занимаюсь веб-разработкой, но не знаю, сталкивался ли я с этим раньше.
Любая помощь приветствуется.
Вопрос заслуживает одобрения, поскольку он полезен и ясен. С другой стороны, я не хочу, чтобы люди нашли решение этой «проблемы».
Это не всегда «проблема». Я пришел сюда, потому что firefox предлагает сохранить пароль для формы, которая содержит пароль WiFi / SSID, а не форму имени пользователя / пароля для входа. Это очень раздражает, и я хочу прекратить это.
Если информация настолько важна, ее следует защищать не только паролем.
Один из способов, которым это, кажется, работает, - это не использовать
<form>. If you are using javascript to send the data (XHR), then you don't need it. I wanted to disable in a system that uses "one-time-password" authentication (no reason to store it). For user/pass authentications I wouldn't recommend to disable that feature.</form>Вероятно, вам нужно ослабить контроль над знакомым вам методом аутентификации и отпустить его, если он действительно противоречит требованиям. Применение политики безопасности с нарушением другой политики безопасности не делает систему более безопасной.
Вы должны Обнадеживающий использовать менеджеры паролей, правильно установив autocomplete = tag. Это способ повысить безопасность.
@Stuart Я полагаю, что пользователю будет удобнее использовать диспетчер паролей, если ему будет предложено нет, хотят ли они сохранить одноразовый код доступа. К сожалению, большинство браузеров больше не позволяют autocomplete = off отключать диспетчер паролей. Одно из объяснений состоит в том, что autocomplete = off никогда не должен иметь ничего общего с менеджерами паролей, что является допустимым моментом, но тогда должно быть что-то специально для этой цели.
@ImperishableNight следует использовать autocomplete = "одноразовый код", как показано здесь. twilio.com/blog/…
@Stuart Вау, я не знал, что тег autocomplete = принимает столько разных значений, кроме «on» и «off». Я предполагаю, что это неправильный ответ на этот конкретный вопрос, но для некоторых «дубликатов» этого вопроса, безусловно, может быть полезна ссылка на developer.mozilla.org/en-US/docs/Web/HTML/Attributes/….

Не совсем - единственное, что вы могли бы реально сделать, - это дать совет на сайте; возможно, перед их первым входом в систему вы могли бы показать им форму с информацией о том, что не рекомендуется разрешать браузеру сохранять пароль.
Тогда пользователь сразу же последует совету, запишет пароль на стикер и прикрепит его к своему монитору.
Вы должны помнить, что это сайт правительство, и подобные вещи носят политический характер. Если кто-то наверху говорит: «Это не должно так работать», тогда то, что реально, не входит в уравнение. Проблема может быть перенесена в заметки Post-It, но политика в отношении них предназначена для другого отдела - проблема была перенесена ;-) И я на самом деле серьезно.
Я не уверен, будет ли это работать во всех браузерах, но вы должны попробовать установить autocomplete = "off" в форме.
<form id = "loginForm" action = "login.cgi" method = "post" autocomplete = "off">
The easiest and simplest way to disable Form and Password storage prompts and prevent form data from being cached in session history is to use the autocomplete form element attribute with value "off".
Некоторые незначительные исследования показывают, что это работает в IE, но я не оставлю никаких гарантий;)
@ Джозеф: Если это строгое требование пройти проверку XHTML с фактической разметкой (хотя не знаю, почему это могло бы быть), вы могли бы теоретически добавить этот атрибут с javascript позже, но тогда пользователи с отключенным js (вероятно, незначительное количество вашей пользовательской базы или ноль, если вашему сайту требуется js), пароли все равно будут сохранены.
Пример с jQuery:
$('#loginForm').attr('autocomplete', 'off');
Небольшой комментарий, поскольку это меняется, HTML5 добавляет в спецификацию атрибут автозаполнения, так что теперь он действителен.
firefox (3.6.15), похоже, вообще не касается autocomplete = "off". Я попытался добавить это как в форму, так и в поле пароля, но он по-прежнему заполняет pwd, когда я нажимаю вкладку в поле имени пользователя. Я также пытался изменить атрибут name поля pwd на что-то другое, но похоже, что он использует атрибут type = "password" (хотя я читал, что он соответствует атрибуту 'name'). Это тоже не работает. Что еще я могу попробовать?
Вы можете использовать расширение Chrome Autocomplete = On, чтобы победить это :) chrome.google.com/webstore/detail/autocomplete-on
К вашему сведению, Microsoft решила, что Internet Explorer 11 больше не поддерживает autocomplete = "off" для полей input type = "password". msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.as px
но я ДЕЙСТВИТЕЛЬНО хочу, чтобы в моей форме было автозаполнение, и НЕ хочу, чтобы браузер сохранял всплывающее окно «сохранить пароль».
Так же, как @JWLim упомянул, что IE 11 прекращает поддержку отключения функции сохранения пароля, точно так же и Firefox. bugzilla.mozilla.org/show_bug.cgi?id=956906
@GregoryCosmoHaun Спасибо за информацию. На самом деле кажется, что браузеры отнимают у нас, разработчиков, все больше и больше возможностей: / Насколько я знаю, мы все еще можем помешать им сохранять пароли, если вы разделите поля «Имя пользователя» и «Пароль». Я упоминал об этом в моем ответ ниже.
да, не работает для Chrome. Независимо от того, что появляется всплывающее окно.
Firefox (к сожалению) последовал примеру Microsoft и также «убрал» поддержку автозаполнения. Подробнее см. Комментарий 100 в следующем обсуждении проблемы: bugzilla.mozilla.org/show_bug.cgi?id=956906
Теперь не работает для Firefox 38+ mozilla.org/en-US/firefox/38.0/releasenotes
Это игнорируется большинством современных браузеров ... caniuse.com/#feat=input-autocomplete-onoff
Итак, каков был бы правильный ответ на этот вопрос? Несмотря на 321 голос за, этот ответ не работает.
Может ли кто-нибудь опубликовать обновленный ответ на Отключение функции браузера «Сохранить пароль» в современном браузере?
Is there a way for a site to tell the browser not to offer to remember passwords?
Веб-сайт сообщает браузеру, что это пароль, используя <input type = "password">. Итак, если вы должен делаете это с точки зрения веб-сайта, вам придется это изменить. (Очевидно, я этого не рекомендую).
Лучшим решением было бы настроить браузер таким образом, чтобы он не запоминал пароли.
Насколько очевидно, что вы не рекомендуете изменять поле типа ввода? Было бы полезно проработать вопросы безопасности.
@karl: потому что необходимость ввода пароля на открытом воздухе позволяет «серфить по плечу», то есть процесс подбора пароля, глядя на экран во время его набора.
Не только люди, занимающиеся серфингом через плечо, но и шпионские программы или вирусы могут смотреть на ваш экран и видеть, что было набрано в полях с открытым текстом.
@karl: Если на вашем компьютере установлено шпионское ПО / вирус, то никакая защита звездочкой вас не спасет. Установленному приложению не сложнее перехватить то, что вводится в поле «пароль», чем сделать то же самое для поля с открытым текстом.
Кроме того, если браузер видит обычный текстовый ввод вместо ввода пароля, он, вероятно, спрячет пароль в базе данных автозаполнение формы вместо базы данных паролей ... а затем предложит его или даже автоматически заполнит его на каком-то несвязанном веб-сайте! Так что на самом деле вам даже хуже, чем когда вы начали.
«Итак, если вы должны сделать это с точки зрения веб-сайта, вам придется это изменить» - но как ???
Один из известных мне способов - использовать (например) JavaScript для копирования значения из поля пароля перед отправкой формы.
Основная проблема в том, что решение привязано к JavaScript.
Опять же, если он может быть привязан к JavaScript, вы также можете хешировать пароль на стороне клиента перед отправкой запроса на сервер.
Хеширование на стороне клиента не заменяет хеширование на стороне сервера. Я не уверен, поможет ли это вообще (если будет сделано дополнительно).
Разрешение хеширования на стороне клиента опасно, потому что это означает, что злоумышленнику не нужно взламывать пароль из хэша, он может просто использовать хеш для входа в систему. Хеш становится эквивалентом пароля.
Я согласен с Brilliand в том, что хэш на клиенте полезен только в том случае, если у вас также есть хеш на сервере перед сохранением пароля в вашей базе данных. Однако наличие хеша на стороне клиента может помочь решить определенное количество проблем с мужчинами посередине. При этом, поскольку код будет доступен (по крайней мере, на общедоступных сайтах) хакерам, он, вероятно, не так полезен, как может показаться.
Маркус поднял важный вопрос. Я решил поискать атрибут autocomplete и получил следующее:
The only downside to using this attribute is that it is not standard (it works in IE and Mozilla browsers), and would cause XHTML validation to fail. I think this is a case where it's reasonable to break validation however. (source)
Поэтому я должен сказать, что, хотя он не работает на 100% по всем направлениям, он обрабатывается в основных браузерах, так что это отличное решение.
У меня проблема с проверкой в соответствии со стандартами w3c. Дело в том, что мне нужна эта функция для веб-сайта мобильного банкинга. Я предполагаю, что мобильные браузеры достаточно строги и иногда могут испортить форму, если используется какой-то недопустимый атрибут. Что посоветуете в этом случае?
Я думаю, что это старый стиль мышления. Многие современные мобильные браузеры построены на основе WebKit и либо поддерживают, либо игнорируют этот атрибут. Я не знаю, как другие страны или браузеры в старых сотовых телефонах справляются с этим, но изящная обработка атрибутов / элементов, которые неизвестны, имеет фундаментальное значение для хорошего браузера. Это «доказательство будущего», чтобы браузер не ломался по мере развития сети. Он может отставать (не реализовывать новые функции), но не сломается. Надеюсь, что это поможет =)
Это должен быть скорее комментарий к упомянутому ответу, чем ответ на сам вопрос.
Вы можете запретить браузеру сопоставлять формы, выбирая случайным образом имя, используемое для поля пароля на каждом шоу. Затем браузер видит пароль для того же URL-адреса, но не может быть уверен, что это тот же пароль. Может быть, он контролирует что-то еще.
Обновлять: обратите внимание, что это должно быть в добавление к с использованием автозаполнения или другой тактики, а не их заменой по причинам, указанным другими.
Также обратите внимание, что это только предотвратит использование браузером автозаполнение пароля. Это не помешает ему использовать хранение пароль на любом уровне произвольной безопасности, который браузер выберет для использования.
[@Joel] (# 32409), который может помешать автоматическому заполнению формы, но помешает ли это браузеру затем запросить сохранение пароля для этой новой формы предполагаемый?
Я не верю, что сейчас это сработает. В FF 13 у меня есть форма с несколькими полями пароля, все с разными именами. FF, как только он сохраняет пароль для этой страницы, вставляет сохраненный пароль во ВСЕ поля пароля. Его не волнует, каковы имена полей (например, у меня есть «new_password» и «old_password», и сохраненный пароль сбрасывается в оба из них). В этой конкретной форме у меня нет имени пользователя для сохранения пароля - только два поля пароля, на случай, если это имеет значение.
Кивает @Jason, каждый раз присваивая полю пароля новый UUID для имени, ничего не предпринимая, чтобы помешать попыткам браузера заполнить его.
Используйте реальный двухфакторная аутентификация, чтобы избежать единственной зависимости от паролей, которые могут храниться во многих других местах, чем кеш браузера пользователя.
Кстати, это аутентификация, а не аутентификация
@Jonathan Pity, я предпочитаю аутентификация
Другим решением может быть реализация JavaScript, который принудительно закрывает браузер после выхода пользователя из приложения. Это полностью очистит память браузера, и, следовательно, данные не будут извлечены из памяти браузера.
Я делал комбинацию autocomplete = "off" и очищал поля пароля с помощью javascript / jQuery.
Пример jQuery:
$(function() {
$('#PasswordEdit').attr("autocomplete", "off");
setTimeout('$("#PasswordEdit").val("");', 50);
});
Используя setTimeout(), вы можете дождаться, пока браузер заполнит поле, прежде чем очистить его, в противном случае браузер всегда будет выполнять автозаполнение после того, как вы очистите поле.
Некоторое время я боролся с этой проблемой, придумав уникальный поворот в ее решении. У привилегированных пользователей не может быть сохраненных паролей, но это необходимо обычным пользователям. Это означало, что привилегированные пользователи должны были войти в систему дважды, во второй раз не применяя сохраненных паролей.
С этим требованием стандартный метод 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>
Похоже, это хорошее решение. Это имеет смысл, поскольку отправляемая вами форма сама по себе не содержит пароля. Я полагаю, что у вас может быть две формы, первая просто для того, чтобы имя пользователя и пароль были видны во всех браузерах.
Мне нравится ваше решение, и я реализовал подобное на моем сайте, просто смешно, как сегодня браузеры не предлагают простой способ решить эту проблему.
Не уверен, что это из-за того, что я застрял в использовании jquery 1.6, но указанный выше jquery работал только после того, как заключил внутрь $ (document) .ready (function () {});
Единственное правильное решение - это, поскольку некоторые браузеры больше не принимают autocomplete = "off"!
Это нормально работало для меня в Chrome, но недавно снова запускается запрос на сохранение пароля.
Нарушение функции безопасности с помощью кода любительского уровня на самом деле является ужасным решением.
Одна проблема, которую я вижу, заключается в том, что скрытый пароль показывает фактический текст пароля в браузере.
Я только что попробовал этот метод в Chrome, Opera и Internet Explorer, и, похоже, он работает, но он не работает с Firefox, к сожалению,
Просто люди понимают - атрибут «автозаполнение» работает большую часть времени, но опытные пользователи могут обойти его, используя букмарклет.
Сохранение паролей в браузере на самом деле увеличивает защиту от кейлоггеров, поэтому, возможно, самый безопасный вариант - сохранять пароли в браузере, но защищать их мастер-паролем (по крайней мере, в Firefox).
autocomplete = "off" работает для большинства современных браузеров, но другой метод, который я использовал, который успешно работал с Epiphany (браузер на базе WebKit для GNOME), - это сохранение случайно сгенерированного префикса в состоянии сеанса (или скрытого поля, которое у меня было подходящая переменная уже в состоянии сеанса) и используйте это, чтобы изменить имя полей. Epiphany все еще хочет сохранить пароль, но при возврате к форме он не заполняет поля.
Это даже хуже, чем хранить их обычным способом, поскольку теперь пользователь не видит, что пароль был сохранен, и при этом не мешает злоумышленнику извлечь пароль из хранилища.
У меня не было проблем с использованием этого метода:
Используйте autocomplete = "off", добавьте скрытое поле пароля, а затем другое не скрытое. Браузер пытается автоматически заполнить скрытый, если он не соблюдает autocomplete = "off"
Если вы не хотите доверять флагу автозаполнения, вы можете убедиться, что пользователь вводит в поле, используя событие onchange. Приведенный ниже код представляет собой простую HTML-форму. Для скрытого элемента формы password_edited установлено значение 0. Когда значение пароля изменяется, JavaScript вверху (функция pw_edited) изменяет значение на 1. При нажатии кнопки он проверяет здесь код ввода значения перед отправкой формы. . Таким образом, даже если браузер игнорирует вас и автоматически заполняет поле, пользователь не может перейти на страницу входа, не введя в поле пароля. Кроме того, убедитесь, что поле пароля пусто, когда установлен фокус. В противном случае вы можете добавить символ в конце, а затем вернуться и удалить его, чтобы обмануть систему. Я рекомендую дополнительно добавить 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>
ИМХО,
Лучший способ - рандомизировать имя поля ввода с type=password.
Используйте префикс «pwd», а затем случайное число.
Создавайте поле динамически и представляйте форму пользователю.
Ваша форма входа будет выглядеть так ...
<form>
<input type=password id=pwd67584 ...>
<input type=text id=username ...>
<input type=submit>
</form>
Затем на стороне сервера, когда вы анализируете форму, отправленную клиентом, ловите поле с именем, которое начинается с «pwd», и используйте его в качестве «пароля».
Обратите внимание, что это не помешает пользователю сохранить пароль, что является здесь основной проблемой. Если удастся избежать экономии, значит, все хорошо. Поскольку избегать предварительного заполнения само по себе бесполезно, пароль был где-то сохранен. Собственно, в вашем случае пользователь мог каждый раз сохранять его и засорять свой браузер своим сверхсекретным паролем ...
Chrome делает агрессивные попытки запоминания и автоматического заполнения полей имени пользователя и пароля, даже если они были переименованы. Радость :)
Другое решение - сделать POST, используя скрытую форму, где все входные данные имеют скрытый тип. Видимая форма будет использовать ввод типа «пароль». Последняя форма никогда не будет отправлена, поэтому браузер не может вообще перехватить операцию входа в систему.
Самый простой способ - использовать атрибут тега 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, после соответствующего " имя пользователя "input.
Какой смысл запрещать браузеру вводить пароль, но позволять ему хранить его? Это только обманывает пользователя, заставляя его думать, что его пароль не хранится, хотя на самом деле он уязвим.
Таким образом, он фактически не будет хранить ваш пароль, потому что вы вводите в другое поле, которое игнорируется FF. Вместо этого он сохранит пустую строку.
@CodesInChaos ИМХО, вам следует пересмотреть свой голос против, потому что ваше беспокойство недействительно
я думаю, что установка autocomplete = "off" совсем не помогает
у меня есть альтернативное решение,
<input type = "text" name = "preventAutoPass" id = "preventAutoPass" style = "display:none" />
добавьте это перед вводом пароля.
например: <input type = "text" name = "txtUserName" id = "txtUserName" />
<input type = "text" name = "preventAutoPass" id = "preventAutoPass" style = "display:none" />
<input type = "password" name = "txtPass" id = "txtPass" autocomplete = "off" />
это не мешает браузеру запрашивать и сохранять пароль. но это не позволяет ввести пароль.
радость
Поскольку Internet Explorer 11 больше не поддерживает autocomplete = "off" для полей input type = "password" (будем надеяться, что никакие другие браузеры не последуют их примеру), самый чистый подход (на момент написания), похоже, заставляет пользователей отправлять свое имя пользователя и пароль на разных страницах, т. Е. Пользователь вводит свое имя пользователя, отправьте, затем введите свой пароль и отправьте. Веб-сайты Банк Америки и HSBC Банк тоже используют это.
Поскольку браузер не может связать пароль с именем пользователя, он не предлагает хранить пароли. Этот подход работает во всех основных браузерах (на момент написания) и будет правильно работать без использования Javascript. Недостатком является то, что это будет более проблематично для пользователя и потребует 2 обратных передачи для действия входа в систему вместо одного, поэтому это действительно зависит от того, насколько безопасным должен быть ваш веб-сайт.
Обновление: как упоминалось в этом комментарий от Грегори, Firefox будет следовать примеру IE11 и игнорировать autocomplete = "off" для полей пароля.
Если вы не укажете имя пользователя, а в браузере хранится несколько учетных записей, firefox отобразит запрос, предлагающий пользователю выбрать имя пользователя :(
Самый простой способ решить эту проблему - добавить поле поддельного пароля в самом начале формы без имени. как и <input type = "password" style = "display:none;"/>, браузер заполняет только первое поле. наша форма будет работать как положено.
Я протестировал это добавление autocomplete = "off" в тег формы во всех основных браузерах. Фактически, большинство людей в США до сих пор используют IE8.
Browser not asking "save password". Also, previously saved username & password not populated.
Обновлено 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();
}
}
Удачи!!!
Хотя этот ответ предоставляет полезную информацию, он на самом деле не отвечает на вопрос о как, чтобы запретить браузерам сохранять пароли.
@JW Lim, я обновил ответ. Пожалуйста, изучите это. Спасибо!
@Sivakumar, Хорошо, включите ОС и версию Safari. чтобы другие люди знали то же самое. он работал в моей системе (Windows 8, Safary 5)
@Asik Safari 8.0.3 и Mac OS 10.10
Настоящая проблема гораздо глубже, чем просто добавление атрибутов в ваш HTML - это общая проблема безопасности, поэтому люди изобрели аппаратные ключи и другие безумные вещи для безопасности.
Представьте, что у вас autocomplete = "off" отлично работает во всех браузерах. Поможет ли это с безопасностью? Конечно нет. Пользователи будут записывать свои пароли в учебники, на стикеры, прикрепленные к их монитору, где каждый посетитель офиса может их видеть, сохранять их в текстовые файлы на рабочем столе и так далее.
Как правило, веб-приложение и веб-разработчик никоим образом не несут ответственности за безопасность конечных пользователей. Конечные пользователи могут только защитить себя. В идеале они ДОЛЖНЫ держать все пароли в голове и использовать функцию сброса пароля (или связаться с администратором) на случай, если они его забыли. В противном случае всегда будет риск, что пароль каким-то образом увидят и украдут.
Таким образом, либо у вас есть какая-то сумасшедшая политика безопасности с аппаратными ключами (например, некоторые банки предлагают интернет-банкинг, который в основном использует двухфакторную аутентификацию), либо вообще ОТСУТСТВУЕТ БЕЗОПАСНОСТЬ. Ну, конечно, это немного преувеличено. Важно понимать, от чего вы пытаетесь защититься:
В этом конкретном посте я вижу неадекватные требования, предъявляемые к разработчику, которые он никогда не сможет решить из-за характера проблемы - безопасности конечного пользователя. Я субъективно считаю, что разработчик должен сказать НЕТ и указать на проблему с требованиями, а не тратить время на такие задачи, честно. Это не совсем сделает вашу систему более защищенной, скорее приведет к случаям с наклейками на мониторах. К сожалению, некоторые начальники слышат только то, что хотят слышать. Однако на вашем месте я бы попытался объяснить, откуда взялась настоящая проблема, и что autocomplete = "off" не решит ее, если только не заставит пользователей хранить все свои пароли исключительно в голове! Разработчик, со своей стороны, не может полностью защитить пользователей, пользователи должны знать, как использовать систему, и в то же время не раскрывать свою конфиденциальную / безопасную информацию, и это выходит далеко за рамки аутентификации.
если autocomplete = "off" не работает ... удалите тег формы и используйте вместо него тег div, а затем передайте значения формы с помощью jquery на сервер. Это сработало для меня.
У меня есть обходной путь, который может помочь.
Вы можете сделать собственный шрифт. Итак, создайте собственный шрифт, например, со всеми символами в виде точки / круга / звезды. Используйте его как собственный шрифт для своего веб-сайта. Посмотрите, как это сделать в 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 не поврежден. Надеюсь, это поможет?
действительно изящное решение есть шрифт пароля здесь
При использовании такого решения необходимо учитывать, что пользователи могут свободно копировать текст, введенный в это поле похожего пароля. Функции копирования и вырезания отключены в полях с настоящим паролем.
Что ж, это очень старый пост, но все же я дам свое решение, которого моя команда пыталась достичь долгое время. Мы просто добавили новое поле input type = "password" внутрь формы, обернули его в div и сделали div скрытым. Убедитесь, что этот div находится до фактического ввода пароля. Это сработало для нас и не дало возможности сохранить пароль.
Планк - 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 Это не сработало для меня в Chrome 47.0.2526.111 ... трюк, чтобы заставить его работать, состоял в том, чтобы добавить еще один текст поля в скрытый div. Браузер просит сохранить пароль, НО он говорит: «Вы уверены, что сохраните эти данные?» а затем отображается пустое имя пользователя и пустой пароль. Это сработало.
Решение почемуAto8 вместе с комментарием @David Bélanger сработало для меня (ни одно из других решений не помогло). Я также должен упомянуть, что я добавил два пустых скрытых поля ПЕРЕД теми, которые фактически используются для ввода данных, а дублированные (скрытые) поля имели одинаковые имена. Таким образом, Chrome (48.0.2564.103) даже не спрашивал, нужно ли сохранять пароль.
Никакая комбинация этого не работает в Chrome 48.0.2564.116. Даже в сочетании с комментарием Дэвида Беланжера всплывающее окно Chrome с просьбой сохранить пароль по-прежнему кэширует пароль, если вы нажмете ОК
Отличный ответ .. Скажите, пожалуйста, почему вы сказали «Убедился, что этот div находится до фактического ввода пароля»? Я поставил этот div после ввода фактического пароля, и он все еще работает ... Так почему вы упомянули об этом?
Привет, извините, я не был уверен в цели, так как перешел в другой проект. Я думаю, что мы хотели, чтобы это было скрыто, но также применили все взаимодействия, которые пользователь делал с фактическим вводом, отображаемым в пользовательском интерфейсе. Итак, как только пользователь делает что-то при вводе, что является видимым, мы копируем взаимодействие на скрытое и передаем данные.
Работает с Google Chrome 53, iOS10 Safari и IE11. Это было серьезной головной болью, которую нужно было выследить. Определенное голосование за !!
autocomplete = "off" не работает для отключения диспетчера паролей в Firefox 31 и, скорее всего, не в некоторых более ранних версиях.
Ознакомьтесь с обсуждением этой проблемы в mozilla: https://bugzilla.mozilla.org/show_bug.cgi?id=956906
Мы хотели использовать второе поле пароля для ввода одноразового пароля, сгенерированного токеном. Теперь мы используем ввод текста вместо ввода пароля. :-(
Мне была поставлена аналогичная задача - отключить автоматическое заполнение логина и паролей браузером, после множества проб и ошибок я обнаружил, что приведенное ниже решение является оптимальным. Просто добавьте элементы управления ниже перед исходными элементами управления.
<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
Самый простой способ решить эту проблему - разместить поля INPUT вне тега FORM и добавить два скрытых поля внутри тега FORM. Затем в прослушивателе событий отправки, прежде чем данные формы будут отправлены на сервер, скопируйте значения из видимого ввода в невидимые.
Вот пример (вы не можете запустить его здесь, поскольку действие формы не настроено на настоящий скрипт входа в систему):
<!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.info('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 ('')
Мой обходной путь 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-разрядная версия).
Это действительно работает. Это предотвращает сохранение пароля браузером. Чтобы не показывать пароль, вы можете заключить поле ввода в скрытый div. И вы уже можете это сделать, если DOM загружен, не нужно ждать, пока вы отправите форму.
Работает на IE 11.0.9600.18161!
Это правда. Теперь я попробовал это в FF 44.0.2, и этот хак больше не работает ... как жаль. В Chrome это все еще работает.
Вы можете заменить input [type = submit] или button [type = submit] на обычную кнопку [type = button] и сделать это в обработчике onclick. Если в форме нет [type = submit], это также предотвратит отправку формы с помощью клавиши ввода и отображение запроса на сохранение пароля.
Столкнувшись с той же проблемой HIPAA и нашел относительно простое решение,
Создайте скрытое поле пароля с именем поля в виде массива.
<input type = "password" name = "password[]" style = "display:none" />
Используйте тот же массив для фактического поля пароля.
<input type = "password" name = "password[]" />
Браузер (Chrome) может предложить вам «Сохранить пароль», но независимо от того, выберет ли пользователь «Сохранить», при следующем входе в систему пароль автоматически заполнит скрытое поле пароля, нулевой слот в массиве, а 1-й слот останется пустым.
Я попытался определить массив, например «пароль [часть2]», но он все равно запомнил. Я думаю, что это отбрасывает его, если это неиндексированный массив, потому что у него нет другого выбора, кроме как отбросить его в первую очередь.
Затем вы используете выбранный вами язык программирования для доступа к массиву, например PHP,
echo $_POST['password'][1];
Этим вы скрываете проблему безопасности - хэш пароля все еще хранится в кеше браузера.
Не могли бы вы уточнить? Пароль будет отправлен в виде обычного текста с помощью POST. Насколько я прочитал, POST-запросы нельзя кэшировать. Вы говорите, что есть альтернатива использованию POST для отправки данных? Или вы говорите, что пароль хранится в браузере, потому что он хранит не пароль, а пустое значение в начале массива, вы тестировали этот метод?
In addition to
autocomplete = "off"
Use
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 и т. д., И работает отлично. Надеюсь это поможет.
@KishoreSahas Я только что протестировал Firefox 49.0.1 и убедился, что он работает так же, как и в предыдущих версиях Firefox.
@KishoreSahas Не могли бы вы опубликовать свой код, чтобы я мог проверить?
@Murat Yıldız: Мне нужно реализовать то же самое, и я следил за вашим кодом. У меня он отлично работает во всех браузерах. Спасибо !
@Sree Я рада, что вам это помогло :)
Я только что протестировал это, и, к сожалению, это не сработало для Firefox (52.0). Это позволило мне сохранить пароль при первом входе в систему и снова войти в систему с сохраненной учетной записью во второй раз. После этого он предварительно заполнял его, когда я иногда переходил к полю пароля, но иногда нет (не уверен, что там). Я вижу пароль в области «Сохраненные логины ...», и вы можете указать пароль там. Похоже, это сработало для Chrome (56.0).
Только что протестировал Mozilla Firefox 52.0, Google Chrome 57.0, Microsoft Edge 38.1 и работает как шарм! ..
@mikato Может быть, вы применили что-то не так, повторите попытку и дайте мне знать, работает ли это ...
@ MuratYıldız Как ни странно казалось, что мой собственный веб-браузер Firefox все еще может сохранять пароль, но другие люди, также использующие Firefox, сказали, что они больше не могут сохранять пароль. Но сейчас, спустя несколько дней, я тоже не могу сохранить свой пароль. Думаю, это сработало, и почему-то у моего браузера была запоздалая реакция. Это может заставить меня винить кеширование, но все же это кажется странным.
@mikato Я рад, что ваша проблема наконец-то решена и вы заставили ее работать должным образом :)
В Safari Mobile может быть ошибка, поскольку этот ответ исправляет ее stackoverflow.com/questions/2530/…
@Ferie Я рад, что это помогает решить проблему;) Спасибо за отзыв.
Windows Firefox 57.0.2 (64-разрядная версия) по-прежнему предлагает сохранить пароль после того, как я это реализовал.
@PanuHaaramo Не имеет значения, если браузер не может запомнить учетные данные пользователя для следующих входов в систему ...
просто пробовал использовать этот метод, и он работает только в Chrome. не работает в Opera, Firefox или Internet Explorer
@chenks Я только что снова протестировал для вас, используя следующие браузеры: Версия Chrome 72.0.3626.109 (официальная сборка) (64-разрядная версия), Firefox Quantum 65.0.1 (64-разрядная версия), Разработчик Firefox Эд. 66.0b7 (64-бит), Internet Explorer 11 и все еще работающий как шарм! ..
@ murat-yildiz ну я не знаю, что тебе сказать. Я тестировал его с текущими версиями перечисленных мной браузеров (в Windows 7), и он не работал в Opera, Firefox и IE11. единственный браузер, в котором он работал у меня, был Chrome. Может быть, вы могли бы предоставить полный html-код своей рабочей версии, чтобы я мог снова протестировать?
<input type="password" name="Password" autocomplete="off" readonly onfocus="this.removeAttribute('readonly');" style="background:#fff; cursor: text;"> Решение отличное, не сомневайтесь. Но если мы его реализуем, пароль frield будет отключен, поэтому после этих изменений я думаю, что это решение не нуждается в дальнейших изменениях. Нам просто нужно добавить белый цвет фона и вид курсора.
@AsadNaeem Я могу зависеть от стилей, используемых на вашей странице. Потому что страница, на которой я использую этот код, не имеет отключенного вида или эффекта, и все работает как шарм в данных версиях браузера.
@ MuratYıldız Я использую Chrome. Так что это может быть версия браузера.
в браузере firefox 84.0b8 (64-битная) версия не работает.
Я пробовал выше autocomplete = "off", но ничего не получилось. если вы используете angular js, я рекомендую использовать кнопку и щелчок ng.
<button type = "button" class = "" ng-click = "vm.login()" />
У этого уже есть принятый ответ, я добавляю это, если кто-то не может решить проблему с помощью принятого ответа, он может пойти с моим механизмом.
Спасибо за вопрос и ответы.
это, очевидно, нарушает нажатие клавиши enter или return для отправки формы.
Поскольку 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.
Windows Firefox 57.0.2 (64-разрядная версия) по-прежнему предлагает сохранить пароль после того, как я это реализовал.
Я протестировал множество решений. Имя динамического поля пароля, несколько полей пароля (невидимые для поддельных), изменение типа ввода с "текст" на "пароль", 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">
Поскольку большинство предложений autocomplete, включая принятый ответ, не работают в современных веб-браузерах (т. Е. Менеджеры паролей веб-браузеров игнорируют autocomplete), более новым решением является переключение между типами password и text и согласование цвета фона с текстом. цвет, когда поле является обычным текстовым полем, которое продолжает скрывать пароль, будучи полем реального пароля, когда пользователь (или такая программа, как KeePass) вводит пароль. Браузеры не просят сохранять пароли, которые хранятся в текстовых полях.
Преимущество этого подхода заключается в том, что он допускает прогрессивное улучшение и, следовательно, не требует Javascript для того, чтобы поле функционировало как обычное поле пароля (вместо этого вы также можете начать с обычного текстового поля и применить тот же подход, но это не совсем HIPAA Соответствует PHI / PII). Также этот подход не зависит от скрытых форм / полей, которые не обязательно могут быть отправлены на сервер (потому что они скрыты), и некоторые из этих уловок также не работают в некоторых современных браузерах.
Плагин jQuery:
Соответствующий исходный код из приведенной выше ссылки:
(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
Нажмите «Добавить запись» в меню, а затем прокрутите страницу вниз до «Модуль: остановить диспетчер паролей».
Отказ от ответственности: хотя этот подход работает для зрячих людей, могут возникнуть проблемы с программным обеспечением для чтения с экрана. Например, программа чтения с экрана может прочитать пароль пользователя вслух, потому что видит текстовое поле. Также могут быть другие непредвиденные последствия использования вышеуказанного плагина. Изменять функциональные возможности встроенного веб-браузера следует осторожно, тестируя самые разные условия и крайние случаи.
На сегодняшний день наиболее многообещающим ответом является @murat. Я сам тестировал его в Firefox, но, как предлагали другие в комментариях, он по-прежнему запрашивает пароль в первый раз. Тогда этого не произойдет, независимо от того, сколько раз вы повторно вводите пароль (в моем случае отправка с использованием Ajax). Если страница перезагружается, описанное выше поведение повторяется.
Я подумал, что у банковских сайтов должна быть такая функциональность, поэтому я проверил onlinesbi.com, и он отлично справляется.! Он не просит хранить пароль ни в одном браузере. Я попытался проверить источник, но не смог понять, он использует некоторую комбинацию скрытых элементов плюс автозаполнение и js. Я не мог понять этого, но на этой платформе их много, и я надеюсь, что кто-то определенно выяснит и разместит это здесь.
Это мой HTML-код для решения. Работает для Chrome-Safari-Internet Explorer.. Я создал новый шрифт, все символы которого выглядят как «●». Затем я использую этот шрифт для текста своего пароля. Примечание. Название моего шрифта - "пароль секретный".
<style type = "text/css">
#login_parola {
font-family: 'passwordsecretregular' !important;
-webkit-text-security: disc !important;
font-size: 22px !important;
}
</style>
<input type = "text" class = "w205 has-keyboard-alpha" name = "login_parola" id = "login_parola" onkeyup = "checkCapsWarning(event)"
onfocus = "checkCapsWarning(event)" onblur = "removeCapsWarning()" onpaste = "return false;" maxlength = "32"/>
Вы должны предоставить greasemonkey-script, чтобы люди могли его снова включить. Я не думаю, что пользователям нравится, когда их заставляют вводить пароль каждый раз ...