Маскирование входных символов без ввода = пароль

Так что у меня проблема с более новыми браузерами, сохраняющими пароли. Скажем, у меня есть окно с паролем:

<input type="password" autocomplete="off" />

Новые браузеры, такие как IE11 и Safari в iOS 7.1, начали игнорировать autocomplete = "off" в боксах с паролем и предлагают пользователю сохранить пароль. В моей компании (банке) мы рассматриваем это как проблему безопасности.

Мне было интересно, решил ли кто-нибудь еще эту проблему. Возможно, кто-то написал плагин javascript, который маскирует обычный ввод [type = text], чтобы атрибут autocomplete = "off" был соблюден.

Update:

Для получения дополнительной информации см. документацию для автозаполнения на msdn: http://msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx

Ответ 1

Во-первых, autocomplete = "off" должен находиться в элементе <form>, а не в отдельных полях. Это связано с тем, что браузеры обычно сохраняют значения для всех полей в данной форме вместе (например, чтобы сохранить несколько комбинаций имени пользователя и пароля для одного и того же сайта).

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

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

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

Как ваш пользователь хранит пароль на своем конце, в конечном счете не ваша проблема с безопасностью, а не то, что вы действительно имеете в любом случае.

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

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

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

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

Ответ 2

Вы можете ввести поддельный пароль, набрав текст, используя собственный шрифт:

@font-face {
  font-family: 'password';
  font-style: normal;
  font-weight: 400;
  src: url(https://jsbin-user-assets.s3.amazonaws.com/rafaelcastrocouto/password.ttf);
}

input.key {
  font-family: 'password';
  width: 100px; height: 16px;  
}
<p>Password: <input class="key" type="text" autocomplete="off" /></p>

Ответ 3

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

Загрузите форму в поле пароля с помощью type="text", так что алгоритмы автозаполнения браузеров будут игнорировать ее. Когда пользователь вводит что-то в этом поле, переключите его type="password".

Я не очень программист на JavaScript, но я взломал JSFiddle, чтобы показать, как это теоретически работает.

Возможно, onfocus будет лучшим способом, но я не пробовал.

Ответ 4

Вы пытались изменить атрибут имени на что-то смешное? Я считаю, что функция автозаполнения основана на атрибуте name. Я не уверен на 100%, но в ограниченном тестировании я изменил атрибут name, изменив тип данных автозаполнения.

Очевидный пример, чтобы быть ясным: name= "username" показывал мое имя пользователя, а name= "email" показывал мои ранее введенные адреса электронной почты. Когда я переключился на name= "браузерыAreStupidForImplementingThisFeature", я не получил никаких данных автозаполнения.

Требуется дальнейшее тестирование, но может быть хорошим местом для начала? Удачи.

Ответ 5

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

// After the page has loaded...
window.addEventListener('load', setTimeout(function() {
  // Wait a bit and then clear out the contents of the field
  document.getElementById('other-password').value='';
}), 100);