Безопасно ли конвертировать электронные письма с другими символами, кроме A-Z, в нижний регистр?

Любой современный поставщик услуг электронной почты рассматривает электронные письма как регистронезависимые, а это означает, что в моем приложении я должен разрешить пользователям входить в систему как с помощью [email protected], так и [email protected].

Что касается символов от A до Z, это легко реализовать, поскольку я всегда могу преобразовать ввод в нижний регистр.

Однако если адрес электронной почты пользователя содержит другие символы, например немецкий ß, который преобразуется в SS в верхнем регистре (который преобразуется обратно в ss в нижнем регистре), или другие международные символы, для которых могут действовать специальные правила преобразования нижнего и верхнего регистра, тогда подвергаюсь ли я теперь риску того, что пользователи не смогут войти в систему, если они введут адрес электронной почты в другом «регистре», отличном от того, в котором они изначально зарегистрировались?

Тогда было бы лучше использовать toLocaleLowerCase() в моем сценарии? Или мне следует преобразовать только символы от A до Z и оставить остальные в том случае, если они были указаны? Или что мне делать в этом случае?

Моя текущая реализация просто (псевдокод):

// when storing the email on my DB
db.user.save({ email: inputEmail.toLowerCase(), ... })

// when finding the user to authenticate
db.user.find("email", inputEmail.toLowerCase())

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

James Thorpe 27.06.2024 14:28

Какую базу данных вы используете. Выполняет ли он автоматически поиск без учета регистра?

phuzi 27.06.2024 14:28

Я использую MongoDB @phuzi

Oscar R 27.06.2024 14:29

Сделайте это для всех языков. Пользователи могут каждый раз пробовать разные способы. Вы можете использовать библиотеку unorm

Ali Sheikhpour 27.06.2024 14:30

Почему вы хотите изменить способ добавления пользователем своего почтового адреса? На мой взгляд, было бы странно, если бы я добавил [email protected], а вы конвертировали бы его во что-нибудь еще, чем я не пользовался.

Nico Haase 27.06.2024 14:32

@Nico OTOH, также было бы странно, если бы один пользователь с одним адресом электронной почты мог зарегистрировать несколько учетных записей, просто по-разному написав свой адрес электронной почты с заглавной буквы.

deceze 27.06.2024 14:36

@NicoHaase, потому что если вы попытаетесь войти в систему, используя [email protected] после регистрации на [email protected], вам в конечном итоге сообщат, что с этим адресом электронной почты не зарегистрирована ни одна учетная запись, что не соответствует тому, как современные поставщики услуг электронной почты обрабатывают это

Oscar R 27.06.2024 14:37

Примечание: рекомендуется вообще рассмотреть эту проблему, а не просто притворяться, что все адреса электронной почты содержат только какое-то произвольно выбранное подмножество ASCII.

deceze 27.06.2024 14:37

@deceze Я читаю комментарий Нико больше, чем было бы странно, если бы адрес отображался в пользовательском интерфейсе иначе, чем он был введен изначально и т. д. - тем более для всего, что попадает в лагерь типа «ExpertsExchange», где потеря капиталов приводит к дополнительным путаница...

James Thorpe 27.06.2024 14:45

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

Nico Haase 27.06.2024 14:55

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

Nico Haase 27.06.2024 14:56

В чем именно здесь проблема? Если пользователь указал один и тот же адрес электронной почты для регистрации и входа в систему, то .toLowerCase() выдаст одну и ту же строку. И почему преобразование в верхний, а затем в нижний вид не приводит к появлению исходных символов и является проблемой? В вашем примере вы не конвертируете в верхний регистр, и я не вижу в этом необходимости.

gre_gor 27.06.2024 15:19

Кроме того, некоторые провайдеры электронной почты могут иметь адреса электронной почты в нескольких формах. т. е. [email protected], [email protected], [email protected] и [email protected] — это адреса электронной почты из одной и той же учетной записи Gmail.

gre_gor 27.06.2024 15:22

@gre_gor Я использовал только немецкий ß в качестве примера, так как я немного знаю немецкий и не знаю другого конкретного примера, но, конечно, есть десятки тысяч символов, о которых я понятия не имею, как они будут вести себя, например, как китайские или арабские символы

Oscar R 27.06.2024 15:30

Лучшим примером проблемы может быть использование верхнего регистра для сопоставления без учета регистра. В этом случае «Strauß@example.com» и «[email protected]» будут совпадать, но почтовый сервер может считать их разными учетными записями.

gre_gor 27.06.2024 16:01

Ну, вы можете либо использовать storedEmail.toLowerCase() === inputEmail.toLowercase() во время регистрации/входа в систему, либо при каждом вводе символа вы можете мгновенно переводить его в нижний регистр (например, <input value = {inputEmail.toLowerCase()} onChange = {setInputEmail} />. Для нескольких языков вы можете использовать toLocaleLowerCase(), я никогда не использовал его, но он преобразует строку в строчные буквы, используя текущая локаль, основанная на языковых настройках браузера

Pratham Jaiswal 27.06.2024 16:23

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

Bergi 27.06.2024 17:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
17
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Любой современный поставщик услуг электронной почты обрабатывает электронные письма без учета регистра.

Да.

Хотя, если вы использовали верхний регистр для сопоставления без учета регистра, Strauß@example.com и [email protected] будут совпадать, но почтовый сервер может считать их разными учетными записями.

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

… это означает, что в моем приложении я должен разрешить пользователям входить в обе

Нет. Вам нужно разрешить вход только под тем же адресом, который использовался при регистрации. Храните это в своей базе данных, а не что-то еще. Это также адрес, который вам нужно будет использовать при отправке электронного письма — не меняйте регистр! Чтобы ответить на главный вопрос, никогда не безопасно преобразовывать адрес электронной почты в другой регистр, независимо от того, делаете ли вы это только для символов [a-z] или нет.

Однако, независимо от адреса электронной почты, хранящегося в профиле пользователя, для удобства вы можете разрешить вход в систему, когда пользователь вводит достаточно похожий адрес электронной почты. Здесь вы можете создавать произвольные правила, при условии, что «Штраусс» войдет в реальную учетную запись Strauß@example.com. Конечно, это означает, что вам также придется запретить пользователям создавать учетные записи с похожими адресами электронной почты, но вы в безопасности, если следуете одним и тем же (произвольным) правилам нормализации для проверки уникальности. Обратите внимание, что также полезно предотвратить гомоглифические атаки, особенно если адрес электронной почты отображается публично или любому другому пользователю.

Хорошо, если я правильно понимаю, мне всегда следует хранить электронное письмо в том виде, в котором оно было предоставлено. Затем, как во время регистрации, так и во время входа в систему, я могу установить свои собственные правила относительно того, что представляет собой уникальность, при условии, что в обоих сценариях применяются одни и те же правила?

Oscar R 27.06.2024 19:43

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

Bergi 27.06.2024 20:38

Другие вопросы по теме