it-swarm.com.ru

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

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

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

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

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

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

418
matt b

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

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

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

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

Update

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

417
Nick Presta

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

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

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

<!DOCTYPE html>
63
Henrik Paul

HTML 4 : нет

HTML 5 : да

Атрибут autocomplete является перечисляемым атрибутом. Атрибут имеет два состояния. Ключевое слово on отображается во включенное состояние, а ключевое слово off отображается в выключенное состояние. Атрибут также может быть опущен. По умолчанию отсутствует значение on . Состояние off указывает на то, что по умолчанию элементам управления формы в форме будет присвоено имя поля автозаполнения off ; состояние "включено" означает, что по умолчанию для элементов управления формы в поле имени поля autofill установлено значение "on".

Ссылка: W

56
RuudKok

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

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

32
Phantom Watson

Нет, хорошая статья здесь Mozilla Wiki.

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

31
David Waters

Как насчет установки его с помощью JavaScript?

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

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

23
Greg

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

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

Ссылка:

19
Malartre

Если вы используете 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");});
11
Totoche

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

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

В текущих версиях браузеров Gecko атрибут autocomplete работает отлично. В более ранних версиях, начиная с Netscape 6.2, он работал с исключением форм с "Адрес" и "Имя".

Update

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

autocomplete="nope"

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

Documetation

8
Emilio Gort

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

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

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

autocomplete='off' 
8
Enigma Plus

Использование случайного атрибута "имя" работает для меня.

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

6
opznhaarlems

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

5
kravietz

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

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

3
Kieron
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");
        }
    }
}
2
Jack Tuck

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

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

2
Snakes and Coffee