Как стать автором
Обновить

UTF-8 кодировка в названиях и паролях Wi-Fi (Emoji)

Время на прочтение4 мин
Количество просмотров47K
Всего голосов 32: ↑26 и ↓6+20
Комментарии95

Комментарии 95

Обновите, в статье были смайлики эмодзи, хабр порезал статью. Исправил.
Первое, что приходит на ум — выделиться из серой массы и использовать в названии сети смайлики Emoji.

Мне не приходит. ЧЯДНТ? :-)
К сожалению на хабре запрещены смайлики в тексте статей, а у меня они были… Поправил, обновите, теперь статья загрузится полностью. Жаль что так получилось, предпросмотр в черновиках вел себя иначе…
Если текст порезался, то скорее всего не запрещены, а просто кому-то из админов лень сконвертировать базу из utf8 в utf8mb4
Примерно по тем же причинам, почему на десктопном хабре под этим комментарием нет кнопки «Ответить»
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Шайтан! У меня ещё и страница перезагружается при открытии спойлера.

Причём эта ветка комментариев тоже съелась на десктопной версии :)

А вот теперь всё что ниже видно только на мобильной версии Хабра. Пришла пора писать багрепорт

UPD: ладно, поигрался 15 минут и вернул как было, благо редактирование у коммента полчаса. Если кто не в курсе, подобные игры с emoji и mysql в особо криворуких случаях могут приводить даже к XSS (но на Хабре у меня не получилось)
Да, все перекосило списком.

Проблема

admin тут Хабр поломался, мы нечаянно...

А можете, пожалуйста, рассказать суть фокуса: как у вас это получилось?
Спасибо :-)
andreymal, очень убедительно, спасибо!

Мы починим, а пока можете обратно вернуть, пожалуйста?
я думаю легко чиниться простым добавлением спойлера в следующем сообщении
починил
на всякий случай
Вы «серая масса»
И как теперь жить?
Xiaomi router с прошивкой Padavan по-умолчанию не позволяет указывать эмодзи в качестве SSID. Но т.к. валидация происходит в JS, это довольно просто решается через консоль разработчика, например, в Хроме.
Нужно просто, находясь на странице редактирования SSID, написать в консоли:
window.validate_ssidchar = function () { return true; };

Источник: www.reddit.com/r/javascript/comments/5zcb8m/can_you_help_me_allow_my_router_to_accept_as_the

UPD ЧТобы эмодзи можно было указать и в пароле, нужно выполнить отключить еще одну функцию валидации:
window.validate_string = function () { return true; };

Вот как выглядит на Андроид
image
Спасибо за инфу, добавил в пост. Картинку добавлять не стал, могут расценить как ненависть к Андроидам…
Не удивлён :) По-моему, у них вообще шаринг вайфая через QR не того, только по NFC…
На самом деле iPhone раньше всех стали поддерживать QR-code для подключения к Wi-Fi. Но вот имено с кодировкой UTF-8 в QR не дружит. Возможно только у меня такая проблема, добавил в пост и в TODO
Хмм, у меня два роутера xiaomi со стоковыми прошивками и я просто копировал эмодзи из таблицы вики. Кроме этого ничего не требовалось.

В пароль тоже принимает?

> пароль: кружка пива и печенька

Хммм. Минимальная длина пароля 8 символов, в андроиде даже кнопка подключения не загорается если их меньше.
В UTF-8 каждый из этих символов занимает по 4 байта.

Предложенные два эмодзи в UTF-8 кодировке занимают 8 байт, это и есть минимальная необходимая длинна пароля. А вот в ASCII 8 байт это 8 символов, по-этому все и привыкли в 8ми символам.

а проверяется ли длина пароля в байтах? Или проверяется всё-таки в количестве символов? Если второе, то всё равно сколько фактически в байтах занимает символ

Вообще зависит от каждой конкретной реализации прошивки роутера / клиента, но по стандарту WPA в байтах.

разговор за проверку на стороне Android был, а не со стороны роутера

Проверяется в байтах. Например, 4 «какашки» дают 8 требуемых байт для разрешения кнопки «сохранить». Samsung S8+, Android Pie. В других телефонах, впрочем, ситуация может отличаться.
Каждый символ UTF-8 это 4 байта. Если у Вас при копировании вставилось только 2 байта, значит какие-то 2 байта просто отбросились, скорее всего как недопустимые… Это я к тому, что 4 какашки это 16 байт, а не 8
Да, тогда это однозначный баг. И, может, даже в апстриме. Увы, никто с Андроидом более не отписался в комментариях для сравнения.
А что, по-вашему Android бывает только в варианте одной единственной прошивки? :)

эм. Аргументация в комментарии, к которому я писал, была однозначная — что проверка в байтах, что не есть верно — вероятнее всего, в UI доступность кнопки проверяется не в введённых байтах, а в количестве введённых символов в текстовом поле.

Не исключено, что в каких-то прошивках проверка длины выполняется не методами UI, а уже в самом коде после перекодировки в ASCII.

не исключено.

Хм… Galaxy S8+, при подключении к вайфаю из клавиатуры пропадает русская раскладка и эмодзи, при попытке вставить скопированный эмодзи из буфера всплывает ошибка "Неверный символ" и ничего не вставляется :(

Так и написано, что доступна только 'стандартная клавиатура'
Как ввести пароль UTF-8? (пробуйте)
На Android 8.1. добавить сеть руками, ввести Emoji в «SSID», затем вырезать и вставить в «Password».
Надеюсь производители внедрят поддержку UTF-8 вместе с WPA3
Баловство, не внедрят.
S8+ (android pie) позволяет вставить скопированный эмодзи из буфера как в имя сети, так и в пароль. Клавиатура стандартная от самсунга.
Что-то я делаю не так, видимо… Переключился на стандартную клавиатуру Samsung — всё равно «Неверный символ», даже при добавлении сети вручную (но тут хотя бы русская раскладка появилась).
Не дай бог такое просочиться в массы.
Согласен.
Например: перебрать пароль из 2 Emoji, это не тоже самое что перебрать 8-и значный пароль.

Сколько вариантов эмодзи? А если не только эмодзи, но и полный набор utf-8 символов? Нужно считать… Опять-таки, сейчас если кто и брутфорсит пароли, то используют словари на базе латинских букв и цифр, эмодзи никто не переберает...

После вашей статьи, название в Emoji будет подсказкой, попробовать перебрать.
Согласно 11 версии Unicode сейчас 1212 Emoji. В одном байте 256 значений (проигнорируем недопустимые символы).
Рассчитываем количество комбинаций.

256^8 = 18 446 744 073 709 551 616 (символов)
1212^2 = 1 468 944 (Emoji)

Разница колоссальная.
В базе 3wifi есть онлайн статистика. Всего в базе почти 10млн записей, а уникальных парольных комбинаций всего 6млн. Т.е., грубо говоря, на половине роутеров стоят совпадающие пароли. Идем дальше, более 6% роутеров вообще не запоролены! Почти на каждом сотом стоит пароль 12345678. Чуть реже стоит пароль 123456789. Знаешь какой пароль на третьем месте? Правильно: 1234567890. В целом, топ 10 паролей покрывают 3% роутеров!

Так что 1,5 млн комбинаций из 2х эмодзи значительно сложнее поддаются перебору, чем любимые всеми даты рождения и номера телефонов. А ещё эмодзи легче запомнить, а значит можно сделать пароль из большего числа символов, а там уже и комбинаций значительно больше. А ещё кроме эмодзи в UTF-8 много других символов…
Если пароли с эмодзи войдут в массу, то этот анекдот станет как никогда актуальным)

Фараон: Здравствуйте, можно забронировать столик на имя Сакрахотеп?
Администратор: Продиктуйте, пожалуйста, по буквам.
Фараон: Птичка, два треугольника, волнистая линия, солнце, опять птичка, собачья голова, скарабей.
И всё в овале с подставочкой, так как фараон же =)
Fritzbox от AVM не умеет, похоже.
Можно для чайника, какие действия нужно сделать последовательно?
У меня мак и роутер тоже эпл)
Попробуй просто скопировать эмодзи и вставить в качестве названия в утилите AirPort.
Все получилось, благодарю)
Кстати о чайниках. Интересно как отреагируют простые устройства на такие пароли.
Непредсказуемо и зависит от того, осознавали ли разработчики прошивки то, что это — последовательность байт, а не строка символов.
Что я делаю не так?
RouterOS 6.43.11, iOS 12.1.2
Скриншоты
image
image
если Вы пытаетесь вставить волшебника, то через терминал попробуйте
/interface wireless set [find name="wlan2"] ssid="\f0\9f\a7\99"
Спасибо большое, только пришлось латинские символы в верхний регистр перевести.
Скажите, пожалуйста, почему Ваш вариант сработал, а мой нет? (код получил по инструкции из этого поста)
Потому что вы на сайте SSID-генератора вставили текст «U+1F9D9», а туда надо было вставлять сам смайл
копируйте картинку из колонки «Browser»
С Микротиком получилось. Можно ли в Кеенетик это запихать?
Оказалось с ними вообще всё просто. Сразу в интерфейсе вставляешь и всё.
Зависит от прошивки. У меня на старом Keenetic 4G II с последней прошивкой не принимает UTF-8, ни через Веб морду, ни через CLI. Возможно как-то можно отключить JS скриптами, но я не осилил, слишком все обфусцировано.
А если сохранить конфигурационный файл на компьютер, в нём заменить название сети строкой взятой из новой прошивки и залить обратно?
Вот этим к примеру: ssid "\xf0\x9f\x93\x9e\xe2\x91\xa4\xe2\x91\xa2-\xe2\x91\xa3\xe2\x93\xaa-\xe2\x93\xaa\xe2\x91\xa1"
Это только название из символов так в этом файле выглядит. С паролями не заморачивался вообще.
нормально все будет
Круто. Осталось понять, зачем это надо

секс в сети теперь не только после подключения к интернету, но и с прелюдией

А ведь ключ и имя точки — это просто последовательсти байт (изначально ASCII), а не символов. Можно же вообще делать имена точек, которые являются некорректной UTF-8 последовательностью.
В UTF-8 есть значек free ()
Но нет значка Wi-Fi. Yandex Translate предлагает:
— mobile phone
— wlan, wireless
— antenna with bars
Как жить-то дальше?
Есть значок antena with bars, как у сотовой сети. Это наиболее близкий по значению значок.
Добавлю немного буквоедства.
Не совсем верно говорить о «поддержке стандарта Unicode в паролях» (к слову, SSID это касается ровно в той же степени — имя сети моего hotspot-а на телефоне — emoji с лягушачьей головой и осьминогом). Что пароль, что SSID, согласно стандарту — просто последовательность octet-ов, то есть байтовая последовательность, а даже не последовательность символов.
А вот уже формы ввода (и даже, вероятно, операционные системы активных сетевых устройств) — препятствие для набора произвольных последовательностей или их правильного сохранения в настройках. По идее, в соответствии с тем, что это просто байтовая последовательность, любая такая форма ввода должна бы принимать ее в виде какой-нибудь escape-последовательности, но в реальности это совершенно не так, потому что SSID и пароль стало принято интерпретировать, как строку символов.
Уточню, почему я говорю именно об интерфейсе. Нередки ситуации, когда, например, через ручное редактирование конфигурации или импорт профиля подключения, возможно использовать самые экзотические последовательности байт для пароля или SSID, при том, что через какой-либо интерфейс (не важно, CLI или GUI) ввести такие последовательности совершенно невозможно.
Вот и наступила расплата
за любовь к
Router Scan by Stas'M.
В пролете
и дома и на работе.
Одно успокаивает,
здесь большинство также в пролете!
Работает на Linksys.

Какая можель и прошивка? Через web интерфейс настраивали? Пароли utf-8 принимает?

Linksys WRT1900AC: www.linksys.com/us/p/P-WRT1900AC
Прошивка родная. Пароль не пробовал.

Телефон на Android в списке сетей emoji не показывает. MacOS и Windows 10 показывают.

D-Link DIR630 (старый домашний роутер dlink): Смайлы в SSID отображаются корректно, но ввод настройки ограничен Javascript'ом на странице (запрещён Unicode).


Обычным POST-запросом дело не решилось (не копался), переопределил функцию проверки в консоли:


strchk_unicode = Object.assign(function (str) { return false; }, strchk_unicode);


Завтра вечером/ночью протестирую роутер TP-Link.

Ниже cccco уже ответил про TP-Link, добавлю свою модель: Archer C5 AC1200.
Работает, проверка только JS. Можно отослать повторный POST со своим текстом на изменение через инструменты разработчика — что я и сделал.

В JS две разных функции: doSubmit() для SSID из /userRpm/WlanNetworkRpm.htm и checkpwd() из /userRpm/WlanSecurityRpm.htm (по прямой ссылке не грузятся).

Опосля заметил, что телефон имя даже в шторке отображает, забавно вышло: i.imgur.com/BfYHR1V.jpg
Ещё один инструмент для достижения цели: сделать МАКСИМАЛЬНО НЕУДОБНО! :)
Netis WF2411E, родная прошивка, через веб-интерфейс позволил установить SSID в виде emoji без каких-либо проблем. С телефона посмотрел, emoji видно. Выглядит забавно. :)

Установить пароль в виде emoji не позволил, сработала валидация.
Каким образом?

По аналогии со всеми остальными роутерми, в js коде убрал проверку на вводимые символы. Написал автору, думаю добавит

Когда Вы вводите текст в мессенджеры, то там и раскладка клавиатуры специальная есть с иконками Emoji. Но при вводе пароля Wi-Fi доступна только стандартная клавиатура!
Очень давно пользуюсь клавиатурой SwiftKey на Android, там можно включать Emoji при вводе пароля
На TP-Link (WR1043ND v1, прошивка 3.13.15 ) полёт для SSID — нормальный. Проверка идёт через JS, и символы Emoji проверку не проходят. Проверяет функция checkname() в центральном фрейме. Замена её на новую не помогла, т.к. судя по всему, js постоянно перегружается с роутера. Пришлось воспользоваться дебагером Хрома. Выставил брейкпоинт в этой функции и подменил значение на валидное (про дебагер в Хроме в этой статье можно почитать).
UniFi с контроллером v5.9.29

SSID успешно задаётся
Про пароль говорит «This field can only contain spaces or printable ASCII characters in the length of 8-63.» (валидацию пока отключить не нашёл как)
Кстати если кто не в курсе, в Windows «эмоджи-клавиатура» вызывается при помощи Win+;
У меня вызвалась экранная лупа и сбила расположение всех иконок. Повбивав би
Под Windows 7 что-то не срабатывает.
Автору респект за статью))) Сделал офисный WiFi с эмодзи, посмотрим, как скоро приползут админы соседей с вопросом «как»))
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории