Статьи

Лучшие пароли № 2: «Показать пароль»

В предыдущем посте этой короткой серии мы рассмотрели скрипт для создания полей маскированных паролей , и я был очень тронут силой ответов на этот пост. Парни, вы, ребята, ненавидите это! В то время, когда я публиковал его, у меня были сомнения относительно определенных аспектов, но в целом я думал, что это хорошая идея.

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

Но, тем не менее, мы столкнулись с исходной проблемой — обычные помеченные поля "password" имеют плохое удобство использования, и было бы неплохо найти лучшее решение.

Так что в этом посте мы рассмотрим альтернативную идею, которую пару из вас уже упомянули, и которая вроде как выдает название этого поста…

Флажок «Показать пароль»

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


Форма входа с флажком «показать пароль».

Лично я бы никогда не стал пропагандировать чисто простое поле пароля, независимо от ситуации, но смысл этого решения в том, что мы даем пользователям контроль . В конце концов, мы всегда знаем, когда мы в безопасности от случайных наблюдателей — я сейчас прислонился к стене, и в любом случае я один в этой комнате!

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

Итак, вот скрипт, который добавляет эту функциональность к полям "password" , прогрессивным и кросс-браузерным способом. Взгляните на демоверсию и получите копию кода:

Разметка первая

Мы начнем этот пример с той же разметки, что и в прошлый раз:

 <label for="pword">Password:</label> <input type="password" id="pword" name="pword" /> 

Но на этот раз нет необходимости изменять существующую разметку, мы просто добавим к ней некоторые новые вещи. Сначала чекбокс и метка, которые являются видимым переключателем, а затем вторичное "text" поле, которое вы видите, когда устанавливаете флажок.

В идеале, мы бы просто переключали type поля между "password" и "text" чтобы достичь этого, но, естественно, это не сработает в IE . Поэтому вместо этого мы создаем второе текстовое поле в том же контексте, что и оригинал, а затем переключаемся между ними, переключая их display .

Таким образом, мы получаем разметку вот так:

 <label for="pword">Password:</label> <span> <input type="password" id="pword" name="pword" /> <input type="text" id="pword" autocomplete="off" style="display:none;" /> <label class="show-password" for="showpasscheckbox-1" title="Show the password as plain text"> <input type="checkbox" id="showpasscheckbox-1" title="Show the password as plain text" /> <span>Show Password</span> </label> </span> 

Теперь наблюдатели с орлиными глазами заметят, что и поле исходного пароля, и новое текстовое поле имеют одинаковые ID , что делает недействительным DOM . Я буду первым, кто признает, что это неправильно, но это прагматично — на самом деле это не просто ID , скрипт копирует каждый атрибут из поля пароля (кроме его name и type ), так что он наследует тот же внешний вид и поведение , и в конечном итоге, выходит так же, как его прародитель. Вы можете удалить это поведение из скрипта, но в этом случае вам нужно будет заменить его на известную семантику стилевого крючка, такую ​​как фиксированное имя class (то, что сторонний скрипт, как этот, никогда не мог бы делать).

Вы могли также заметить подлый autocomplete = «off» там, но расслабьтесь! Это просто на простом поле для предотвращения дублирования — автозаполнение в поле пароля работает так же, как обычно.

Сценарий последний

События, которые нам нужны, чтобы сделать эту работу, на самом деле довольно простые. Прежде всего, у нас есть обработчик change как для пароля, так и для текстового поля, так что ввод в один из них обновляет значение в другом. Нет необходимости использовать более непосредственное событие, чем onchange , потому что по определению вы не можете просматривать одно поле, не удаляя фокус из другого.

Затем на самом флажке есть обработчик click , который переключает отображение двух полей — так, чтобы одно из них было видимым, а другое скрыто (текстовое поле по умолчанию скрыто). Но в этой точке также есть небольшая ошибка, которая означает, что всякий раз , когда мы переключаем поля, мы также должны обновлять их значения , т.е. повторно скопируйте значение из отображаемого в данный момент поля в поле, которое должно быть показано…

При переходе по истории браузера с отправленной страницы обратно в форму в некоторых браузерах вы обнаружите, что одно из значений все еще там, а другое удаленоIE пароль все еще будет, но обычное значение удалено, в Opera все будет наоборот, в Firefox они оба будут пустыми). Эти несоответствия (которые возникают из-за различий в безопасности браузера и моделях событий) могут привести к тому, что эти два значения будут не синхронизированы, поэтому, чтобы поддерживать их синхронизацию, мы просто должны убедиться, что всякий раз, когда мы переключаем отображение полей, мы также синхронизируем их значения ,

Мы также должны сделать что-то подобное предварительное представление. Возможно, что пользователь вернется в историю в состояние моментального снимка в браузере, где было видно простое поле, затем повторно введет или отредактирует это значение и сразу же повторно отправит его, не переключаясь обратно в поле пароля. Это представляет проблему, потому что поле пароля является тем с полем отправляемого значения в нем; простое поле — это просто показание. Поэтому, чтобы исправить это, мы добавляем подпрограмму непосредственно перед отправкой формы (т. submit Слушатель submit который не влияет на собственное поведение), который копирует значение из обычного поля в поле пароля, если обычное поле является тем, которое видимый.

Интермеццо!

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

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

Я не думаю, что есть какой-то способ, которым мы можем уловить эту ситуацию, потому что, что касается событий сценария, ничего не произошло — никакие события не запускаются, потому что никаких событий не произошло. Странно, да? И все же совершенно разумно!

Я думаю, что мы можем немного успокоиться в том факте, что пользователи Opera — которые, как правило, более демографичны, чтобы быть более технически грамотными, не говоря уже о том, что они очень хорошо знают, как работает их браузер — вероятно, не будут слишком удивлены этим. Я имею в виду, я живу в Opera большую часть времени, и одна из вещей, которые мне больше всего нравятся в этом, это то, как вы можете шаг за шагом проходить через отправку форм, не вызывая события сценария !!

Слишком легко!

Так что это почти все, что нужно — никаких неприятных сюрпризов!

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

Присоединяйтесь ко мне в ближайшее время для третьего и последнего поста в этой серии, где я буду смотреть на что-то маленькое и милое, что вы можете добавить практически в любом месте!

Миниатюра кредит: явно неоднозначно