Вимкніть функцію браузера "Зберегти пароль"


423

Однією з радостей роботи в урядовому агентстві охорони здоров’я є боротьба з усією параноїєю навколо боротьби з PHI (Protected Information Health). Не зрозумійте мене неправильно, я все для того, щоб зробити все можливе, щоб захистити особисту інформацію людей (здоров'я, фінансові, навички серфінгу тощо), але іноді люди стають занадто стрибаними.

Справа в суті: Один з наших державних клієнтів нещодавно з’ясував, що браузер надає зручну функцію для збереження вашого пароля. Всі ми знаємо, що він там був деякий час і є абсолютно необов’язковим, і кінцевий користувач повинен вирішити, чи це розумне рішення використовувати чи ні. Однак на даний момент є деякий шум, і від нас вимагають знайти спосіб відключити цю функціональність для нашого сайту.

Питання : Чи існує спосіб, коли сайт скаже браузеру не пропонувати запам'ятовувати паролі? Я довгий час займався веб-розробкою, але не знаю, що раніше я стикався з цим.

Будь-яка допомога вдячна.


6
Ви повинні надати сценарій жирного ключа, щоб люди могли його повторно включити. Я не думаю, що користувачів люблять примушувати вводити пароль кожен раз ...
ThiefMaster

14
Питання заслуговує на користь і зрозумілість. З іншого боку, я не хочу, щоб люди знаходили рішення цієї "проблеми".
Ян Бойд

11
Це не завжди є «проблемою». Я прийшов сюди, тому що Firefox пропонує зберегти пароль для форми, яка містить пароль WiFi / SSID, а не форму користувача / пароля для входу. Це дуже дратує, і я хочу це зупинити.
srd

1
Якщо інформація є такою критичною, її слід захищати більше ніж просто паролем.
Сем Уоткінс

Один із способів, як здається, працює - це не використовувати <form>. Якщо ви використовуєте javascript для надсилання даних (XHR), вони вам не потрібні. Мені хотілося відключити в системі, яка використовує автентифікацію "одноразовий пароль" (немає причини зберігати її). Для автентифікації користувача / проходу я б не рекомендував відключати цю функцію.
lepe

Відповіді:


322

Я не впевнений, чи він працюватиме у всіх браузерах, але спробуйте встановити autocomplete = "off" у формі.

<form id="loginForm" action="login.cgi" method="post" autocomplete="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 додає атрибут автозаповнення в специфікацію, тому він дійсний і зараз.
Тайлер Егето

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
Gregory Cosmo Haun

3
Firefox (на жаль) слідував за лідерами Microsoft і також "зняв" підтримку автозаповнення. Докладніше див. Коментар 100 у наступній дискусії випуску: bugzilla.mozilla.org/show_bug.cgi?id=956906
Біт відскаку

8
Тепер не працюйте для Firefox 38+ mozilla.org/en-US/firefox/38.0/releasenotes
Illuminator

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: Я повинен реалізувати те саме, і я дотримувався вашого коду. Він працює для мене добре у всіх браузерах. Дякую !
Sree

1
@Sree Я щасливий, що тобі було корисно :)
Murat Yıldız

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 працював лише після обгортання всередині $ (документа) .ready (function () {});
rgbflawed

Єдина правильна думка - це так, оскільки деякі браузери більше не приймуть автозаповнення = "вимкнено"!
Абадіс

1
Я щойно спробував цей метод на chrome, Opera та Internet Explorer, і, здається, він працює, але він не працює з Firefox несподівано
chenks

29

Ну, це дуже старий пост, але все ж я дам своє рішення, якого моя команда давно намагалася досягти. Ми щойно додали нове поле типу type = "password" всередину форми і загорнули його в 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;}

1
Однією з переваг цього способу порівняно з тими, хто використовує приховані введення, є те, що таким чином пароль ніколи не зберігається в полі
прямого

@ whyAto8 Це не працювало для мене в Chrome 47.0.2526.111 ... трюк, щоб змусити його працювати, було додати ще один текст поля у прихований розділ. Веб-переглядач просить зберегти пароль, але в ньому написано "Ви впевнені, що збережете це крендеалі?" а потім відображається порожнє ім’я користувача та порожній пароль. Це спрацювало.
Девід Белангер

1
чому рішенняAto8 разом із коментарем @David Bélanger працювало на мене (жодне з інших рішень не робило). Я також повинен зазначити, що я додав два порожні приховані поля перед тим, як насправді використовувались для введення даних, і дублювані (приховані) поля мали однакові відповідні назви. Таким чином Chrome (48.0.2564.103) навіть не запитував, чи потрібно зберігати пароль.
Вадим

Жодна комбінація цього не працює в Chrome 48.0.2564.116. Навіть у поєднанні із коментарем DavidBelanger, спливаюче вікно Chrome із проханням зберегти пароль все одно кешує пароль, якщо натиснути кнопку ОК
ChrisO

Чудова відповідь. Просто скажіть, будь ласка, чому ви сказали "Переконайтесь, що цей дів знаходиться перед фактичним введенням пароля" ? Я поставив цей div після того фактичного введення пароля, і він все ще працює .. То чому ви це згадали?
Мартін AJ

16

Ви можете перешкодити браузеру співставляти форми, рандомізувавши ім’я, яке використовується для поля пароля на кожному шоу. Тоді браузер бачить пароль для тієї ж URL-адреси, але не може бути впевнений, що це той самий пароль . Можливо, це контролювати щось інше.

Оновлення: зауважте, що це має бути на додаток до використання автозаповнення чи інших тактик, а не заміни їх з причин, зазначених іншими.

Також зауважте, що це заважатиме браузеру автоматично заповнювати пароль. Це не заважатиме йому зберігати пароль у будь-якому рівні довільної безпеки, яку браузер вирішить використовувати.


5
[@Joel] (# 32409), який може перешкоджати автоматичному заповненню форми, але чи не перешкоджатиме браузер запитувати пароль для цієї передбачуваної нової форми?
Джозеф Пекораро

3
Я не вірю, що це зараз спрацює. У FF 13 у мене є форма з кількома полями пароля, всі з різними іменами. FF, коли він зберігає пароль для цієї сторінки, вставляє збережений пароль у ВСІ поля поля. Не байдуже, як називаються поля (наприклад, у мене є "new_password" і "old_password", і збережений пароль потрапляє в обидва). У цій конкретній формі у мене немає імені користувача, щоб зберегти пароль - лише два поля пароля, на випадок, якщо це зміниться.
Джейсон

1
Nods @Jason, даючи поле пароля новому UUID для імені кожен раз, нічого не робило, щоб перемогти спроби браузера його заповнити.
FP Free

14

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


2
btw це автентифікація, а не аутентифікація
Джонатан.

26
@Jonathan Шкода, я віддаю перевагу автентифікації
Ian Boyd

Іншим рішенням може бути реалізація JavaScript, який примусово закриває браузер, коли користувач виходить із програми. Це призведе до вимивання повної пам’яті браузера, а отже, з пам’яті браузера неможливо отримати жодних даних.
Аджай Такур

13

Найчистіший спосіб - використовувати 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 після відповідного "імені користувача" вхід.


Який сенс у запобіганні браузеру не заповнювати пароль, але дозволяти йому зберігати його? Це лише обманює користувача думати, що їх пароль не зберігається, хоча він насправді вразливий.
CodesInChaos

Таким чином, він фактично не зберігає ваш пароль, оскільки ви вводите інше поле, яке ігнорується FF. Натомість він буде зберігати порожній рядок.
venimus

@CodesInChaos IMHO вам слід переглянути свій внесок, оскільки ваше занепокоєння не дійсне
venimus

12

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

  1. IE8, IE9, IE10, Firefox, Safari - це чудово.

    Браузер не запитує "зберегти пароль". Також раніше збережені ім'я користувача та пароль не заповнюються.

  2. Chrome & IE 11 не підтримує функцію autocomplete = "off"
  3. FF, що підтримує автозаповнення = "вимкнено". але іноді наявні збережені облікові дані заповнюються.

Оновлено 11 червня 2014 року

Нарешті, нижче - крос-браузерне рішення, що використовує JavaScript, і воно працює добре у всіх браузерах.

Потрібно видалити тег "form" у формі входу. Після перевірки на стороні клієнта помістіть ці облікові дані у приховану форму та надішліть їх.

Також додайте два способи. один для перевірки "validateLogin ()" та інший для прослуховування події введення, натискаючи "Enter" у текстовому полі / паролі / кнопці "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 Лім

@JW Lim, я оновив відповідь. Будь ласка, погляньте на це. Дякую!
Асик

@Sivakumar, Ok, будь ласка, включіть ОС та версію Safari. щоб інші люди знали те саме. він працював у моїй системі (windows 8, Safary 5)
Asik,

@Asik Safari 8.0.3 та Mac OS 10.10
Sivakumar

7

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

Тоді користувач негайно дотримуватиметься порад, записує пароль у примітці після нього та відклеює на монітор.


10
Ви повинні пам’ятати, що це урядовий сайт, і такі речі політично звинувачені. Якщо хтось із високих скаже: "Це не повинно працювати так", то те, що реально, не є частиною рівняння. Проблема може бути перенесена на нотатки Post-It, але політика щодо них полягає в тому, щоб вирішити інший відділ - проблема була перенесена на ;-) І я насправді серйозний.
Джейсон

6

Те, що я роблю, - це поєднання автозаповнення = "вимкнено" та очищення полів паролів за допомогою 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.


Windows Firefox 57.0.2 (64-розрядна) все ще пропонує зберегти пароль після того, як я його застосував.
Пану Хаарамо

2

Просто люди розуміють - атрибут "автозаповнення" працює більшу частину часу, але користувачі, які живлять електроенергію, можуть обійти його за допомогою закладок.

Наявність браузера збереження ваших паролів фактично підвищує захист від блокування журналів, тому, можливо, найбезпечнішим варіантом є збереження паролів у браузері, але захист їх за допомогою головного пароля (принаймні, у Firefox).


2
"але користувачі енергії можуть її обійти" - це стосується більшості функцій додатків, Інтернету чи ні, і це не повинно бути приводом для обмеження системи. Люди також можуть писати свої паролі на post-its і розміщувати їх на своєму моніторі. Ви можете зробити стільки для безпеки з точки зору програми, а надання значущої поведінки за замовчуванням (не зберігаючи її локально) - це початок.
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. Потім у слухачеві події подання, перш ніж дані форми надсилаються на серверні копіюють значення з видимого вводу на невидимі.

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

<!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-розрядні).


1
Це насправді працює. Це запобігає збереженню браузера. Щоб не відображати пароль, ви можете загорнути поле введення в прихований роздільник. І ви вже можете це зробити, якщо DOM завантажений, не потрібно чекати, поки ви подасте форму.
Пором Краненбург

Працює на IE 11.0.9600.18161!
Lu55

Це правда. Тепер я спробував це у FF 44.0.2, і цей хак вже не працює ... яка шкода. У Chrome це все ще працює.
ovalek

Ви можете замінити введення [type = submit] або кнопку [type = submit] звичайною кнопкою [type = button] і зробити це в обробці onclick. Якщо у формі немає [type = submit], це також не дозволить подати форму разом із клавішею enter та з'явиться запит на збереження пароля.
Стівен Дон

2

Я випробував багато рішень. Динамічне ім'я поля пароля, кілька полів пароля (невидимі для підроблених), зміна типу введення з "текст" на "пароль", автозаповнення = "вимкнено", автозаповнення = "новий-пароль", ... але нічого не вирішило це з останнім часом браузер.

Щоб позбутися пароля пам’ятайте, я нарешті розглянув пароль як поле введення та "розмив" текст, який набрав.

Він менш "безпечний", ніж рідне поле пароля, оскільки вибравши введений текст, він відображатиметься як чіткий текст, але пароль не запам'ятовується. Це також залежить від активації 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"але все-таки все вдало якщо ви використовуєте кутовий js, моя рекомендація - перейти з кнопкою та натиснути ng.

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

Це вже є прийнятою відповіддю, додаючи це, якщо хтось не може вирішити проблему з прийнятою відповіддю, він може піти з моїм механізмом.

Дякуємо за запитання та відповіді.


це очевидно порушує натискання клавіші enterабо, returnщоб надіслати форму.
8eecf0d2

0

Я знаю один із способів використання (наприклад, JavaScript) для копіювання значення з поля пароля перед подачею форми.

Основна проблема з цим полягає в тому, що рішення пов'язане з JavaScript.

Знову ж таки, якщо він може бути прив’язаний до JavaScript, ви можете також запозичити пароль на стороні клієнта, перш ніж надсилати запит на сервер.


Хешинг на стороні клієнта не замінює хешування на стороні сервера. Я не впевнений, чи це взагалі допомога (якщо це зроблено додатково).
Brilliand

2
Дозволити хешування на стороні клієнта небезпечно, оскільки це означає, що зловмиснику не потрібно зламати пароль з хешу, вони можуть просто використовувати хеш для входу. Хеш стає еквівалентним паролю.
rjmunro

Я погоджуюся з Brilliand, що хеш для клієнта корисний лише в тому випадку, якщо ви також маєте хеш на сервері перед збереженням пароля у вашій базі даних. Однак хеш на стороні клієнта може допомогти певній кількості проблем із чоловіками в середині. Це говориться, оскільки код буде доступний (принаймні на публічних сайтах) хакерам, він, мабуть, не такий корисний, як може здатися.
Алексіс Вілке

0

Справжня проблема набагато глибша, ніж просто додавання атрибутів до вашого HTML - це загальна проблема безпеки, тому люди для безпеки винайшли апаратні ключі та інші шалені речі.

Уявіть, що у вас є autocomplete = "off", який ідеально працює у всіх браузерах. Чи допомогло б це забезпечити безпеку? Звичайно ні. Користувачі записують свої паролі в підручники, на наклейки, прикріплені до монітора, де їх може побачити кожен відвідувач офісу, зберегти їх у текстові файли на робочому столі тощо.

Як правило, веб-додаток та веб-розробник жодним чином не несе відповідальності за безпеку кінцевих користувачів. Кінцеві користувачі можуть захистити себе лише. В ідеалі вони ОБОВ'ЯЗКОВО зберігати всі паролі в голові та використовувати функцію скидання пароля (або зв’язатися з адміністратором), якщо вони забули його. Інакше завжди буде ризик того, що пароль можна якось побачити та вкрасти.

Тож або у вас є якась шалена політика безпеки з апаратними ключами (наприклад, деякі банки пропонують Інтернет-банкінг, який в основному використовує двофакторну автентифікацію) або в основному НЕ БЕЗПЕЧЕННЯ. Ну, це трохи перебільшено, звичайно. Важливо зрозуміти, що ви намагаєтесь захистити від:

  1. Не дозволений доступ. В основному досить простої форми входу. Іноді вживаються додаткові заходи, такі як випадкові питання безпеки, CAPTCHA, загартовування паролем тощо.
  2. Довірений нюх. HTTPS ОБОВ'ЯЗКОВО, якщо люди отримують доступ до вашої веб-програми із загальнодоступних точок доступу Wi-Fi тощо. Зазначте, що навіть маючи HTTPS, ваші користувачі повинні регулярно змінювати свої паролі.
  3. Інсайдерська атака. Є два безлічі прикладів, починаючи від простої крадіжки ваших паролів з браузера або тих, які ви записали десь на столі (не вимагає жодних ІТ-навичок) і закінчуючи підробкою сесії та перехопленням локального мережевого трафіку (навіть зашифрованого) і надалі отримувати доступ до веб-додатків так само, як це був інший кінцевий користувач.

У цьому конкретному пості я бачу неадекватні вимоги до розробника, які він ніколи не зможе вирішити через характер проблеми - безпеку кінцевого користувача. Моя суб'єктивна думка полягає в тому, що розробник повинен в основному сказати "НІ" і "вказувати на проблему вимог", а не витрачати час на такі завдання, чесно. Це абсолютно не робить вашу систему більш захищеною, вона швидше призведе до випадків із наклейками на моніторах. На жаль, деякі начальники чують лише те, що хочуть почути. Однак, якби я був ти, я б спробував пояснити, звідки походить справжня проблема, і що autocomplete = "off" не вирішить її, якщо це не змусить користувачів зберігати всі свої паролі виключно в голові! Розробник на його кінці не може повністю захистити користувачів,


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

Натисніть "Додати запис" у меню, а потім прокрутіть донизу сторінки "Модуль: Зупинка менеджера паролів".

Відмова від відповідальності: Хоча такий підхід працює для людей, які бачать видимість, з програмним забезпеченням для читання екранів можуть виникнути проблеми. Наприклад, зчитувач екрана може прочитати пароль користувача вголос, оскільки він бачить звичайне текстове поле. Можуть бути й інші непередбачені наслідки використання вищевказаного плагіна. Змінення вбудованої функціональності веб-браузера повинно здійснюватися скупо, перевіряючи широкий спектр умов та кращих випадків.


-1

Чи існує спосіб, щоб сайт повідомив браузеру не пропонувати запам'ятовувати паролі?

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

Найкращим рішенням буде користувач налаштувати свій браузер, щоб він не запам’ятав паролі.


3
Як очевидно, що ви не рекомендуєте змінювати поле типу введення? Розробка питань безпеки була б корисною.
Карл

1
@karl: оскільки введення пароля у відкритому режимі дозволяє "серфінг через плечі", процес отримання пароля, дивлячись на екран під час його введення.
Девід Шмітт

Не лише серфінг за плечима, але й шпигунські програми чи віруси можуть дивитись ваш екран і бачити, що було введено у поля прямого тексту.
Карл

6
@karl: Якщо у вас на комп'ютері шпигунське / вірус, то жоден захист від зірочок не врятує вас. Встановленому додатку не складніше перехопити те, що вводиться у поле «пароль», ніж це зробити для поля з простим текстом.
Маркус Ольссон

3
Крім того, якщо браузер бачить звичайний текст замість введення пароля, він, ймовірно, зберігає пароль у формі автозаповнення бази даних замість бази даних паролів ..., а потім запропонує його або навіть автоматично заповнить його на якомусь незв’язаному веб-сайті! Тож ти насправді навіть гірше, ніж коли ти починав.
zwol

-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 = "вимкнено" не працює для відключення диспетчера паролів у Firefox 31 і, швидше за все, не в деяких попередніх версіях.

Ознайомтесь із обговоренням у цьому розділі на мозіллі: 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


-2

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


Це навіть гірше, ніж зберігати їх звичайним способом, оскільки зараз користувач не бачить, що пароль був збережений, не заважаючи зловмиснику витягнути пароль із магазину.
CodesInChaos

-2

У мене не було жодних проблем із використанням цього методу:

Використовуйте autocomplete = "off", додайте поле прихованого пароля, а потім інше не приховане. Браузер намагається автоматично заповнити прихований, якщо він не поважає autocomplete = "off"


-2

Ще одне рішення - зробити POST за допомогою прихованої форми, де всі вхідні дані приховані. У видимій формі буде використано введення типу "пароль". Остання форма ніколи не буде подана, і тому браузер не може перехопити взагалі операцію входу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.