Есть ли действующий способ W3C отключить автозаполнение в HTML-форме?

При использовании xhtml1-transitional.dtd doctype сбор номера кредитной карты с помощью следующего HTML-кода

<input type="text" id="cardNumber" name="cardNumber" autocomplete='off'/>

отметит предупреждение на валидаторе W3C:

нет атрибута "автозаполнение".

Есть ли способ W3C / standard отключить автозаполнение в браузере конфиденциальных полей в форме?

Ответов (18)

Решение

Вот хорошая статья из MDC, в которой объясняются проблемы (и решения) для автозаполнения. Microsoft опубликовала здесь нечто подобное .

Честно говоря, если это важно для ваших пользователей, такое «нарушение» стандартов кажется уместным. Например, Amazon довольно часто использует атрибут «автозаполнение», и, похоже, он работает хорошо.

Если вы хотите полностью удалить предупреждение, вы можете использовать JavaScript, чтобы применить атрибут к браузерам, которые его поддерживают (IE и Firefox являются важными браузерами), используя someForm.setAttribute( "autocomplete", "off" ); someFormElm.setAttribute( "autocomplete", "off" );

Наконец, если ваш сайт использует HTTPS, IE автоматически отключает автозаполнение (как и некоторые другие браузеры, насколько мне известно).

Обновлять

Поскольку этот ответ по-прежнему получает довольно много голосов, я просто хотел указать, что в HTML5 вы можете использовать атрибут autocomplete в своем элементе формы. См. Документацию по W3C.

Как насчет настройки с помощью JavaScript?

var e = document.getElementById('cardNumber');
e.autocomplete = 'off'; // Maybe should be false

Это не идеально, но ваш HTML будет действителен.

У меня работает случайный атрибут name.

Я сбрасываю атрибут name при отправке формы, чтобы вы могли получить к нему доступ по имени при отправке формы. (используя атрибут id для хранения имени)

Другой способ, который также поможет с безопасностью, - это вызывать в поле ввода что-то новое каждый раз, когда вы его отображаете: точно так же, как капта. Таким образом, сеанс может считывать только одноразовый ввод, и автозаполнению нечего делать.

Просто замечание относительно вопроса rmeador о том, следует ли вам вмешиваться в работу браузера: мы разрабатываем системы управления контактами и CRM, и когда вы вводите данные других людей в форму, вы не хотите, чтобы она постоянно предлагала ваши собственные данные.

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

autocomplete='off' 

Обратите внимание, что есть некоторая путаница в расположении атрибута автозаполнения. Его можно применять либо ко всему тегу FORM, либо к отдельным тегам INPUT, и это не было стандартизовано до HTML5 (что явно допускает оба местоположения ). В более старых документах, особенно в этой статье Mozilla, упоминается только тег FORM. В то же время некоторые сканеры безопасности будут искать только автозаполнение в теге INPUT и жаловаться, если оно отсутствует (даже если оно находится в родительской FORM). Более подробный анализ этого беспорядка размещен здесь: Путаница с атрибутами AUTOCOMPLETE = OFF в формах HTML .

if (document.getElementsByTagName) {
    var inputElements = document.getElementsByTagName("input");
    for (i=0; inputElements[i]; i++) {
        if (inputElements[i].className && (inputElements[i].className.indexOf("disableAutoComplete") != -1)) {
            inputElements[i].setAttribute("autocomplete","off");
        }
    }
}

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

<form name="form1" id="form1" method="post" autocomplete="off"
   action="http://www.example.com/form.cgi">
  [...]
</form>

В текущих версиях браузеров Gecko атрибут автозаполнения работает отлично. Для более ранних версий, возвращаясь к Netscape 6.2, он работал за исключением форм с «Адрес» и «Имя».

Обновлять

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

autocomplete="nope"

Поскольку это случайное значение не является a valid one, браузер откажется.

Документация

Это решение работает со мной:

$('form,input,select,textarea').attr("autocomplete", "nope");

если вы хотите использовать автозаполнение в этой области: добавьте autocomplete="false" в элемент ex:

<input id="search" name="search" type="text" placeholder="Name or Code" autcomplete="false">

Я СДЕЛАЛ ЭТУ РАБОТУ В 2020 ГОДУ!

Я в основном создаю класс css, который применяет -webkit-text-security к моим входам.

Вот ссылка на недавнее обсуждение: https://answacode.com/a/64471795/8754782

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

Если бы вы дали полю ввода имя типа " email_<?= randomNumber() ?> ", а затем имели бы сценарий, который получает этот цикл данных через переменные POST или GET, ищущий что-то, соответствующее шаблону " email_[some number] ", вы могли бы выполнить это, и это было бы ( практически) гарантированный успех вне зависимости от браузера .

Я был бы очень удивлен, если бы W3C предложил способ работы с (X) HTML4. Функция автозаполнения полностью основана на браузере и была введена в последние годы (намного позже, чем был написан стандарт HTML4).

Однако не удивлюсь, если он будет в HTML5.

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

<!DOCTYPE html>

Нет, хорошая статья находится здесь, в Mozila Wiki .

Я бы и дальше использовал инвалид attribute . Я думаю, что здесь прагматизм должен преобладать над подтверждением.

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

Не уверен, сработает это или нет, это просто мысль.

HTML 4 : Нет

HTML 5 : Да

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

Ссылка: W3

Действующее автозаполнение отключено

<script type="text/javascript">
    /* <![CDATA[ */
    document.write('<input type="text" id="cardNumber" name="cardNumber" autocom'+'plete="off"/>');
    /* ]]> */ 
</script>

Если вы используете jQuery, вы можете сделать что-то вроде этого:

$(document).ready(function(){$("input.autocompleteOff").attr("autocomplete","off");});

и используйте класс autocompleteOff там, где хотите:

<input type="text" name="fieldName" id="fieldId" class="firstCSSClass otherCSSClass autocompleteOff" />

Если вы хотите, чтобы ВСЕ ваш ввод был autocomplete=off, вы можете просто использовать это:

$(document).ready(function(){$("input").attr("autocomplete","off");});

Я предлагаю уловить все 4 типа ввода:

$('form,input,select,textarea').attr("autocomplete", "off");

Ссылка:

Думаю, есть способ попроще. Создайте скрытый ввод со случайным именем (через javascript) и установите для него имя пользователя. Повторите с паролем. Таким образом, ваш backend-скрипт точно знает соответствующее имя поля, сохраняя при этом автозаполнение в неведении.

Я, наверное, ошибаюсь, но это всего лишь идея.