Как сделать функцию кодирования / декодирования в Base62 без явного шаблона в результатах?
У меня есть сайт, на котором пользователи должны подтверждать свою электронную почту, используя типичный сценарий подтверждения электронной почты с определенной (но длинной) ссылкой для каждого пользователя, которая включает обычный хэш-параметр.
У меня проблема в том, что у некоторых пользователей возникают проблемы с длинным и сложным каналом подтверждения из-за устройства, которое они используют.
Поэтому мне нужно создать альтернативный способ генерации уникальной ссылки подтверждения для каждого пользователя, чтобы шаблон не был очевидным, чтобы его нельзя было понять и злоупотребить.
Я смотрел на кодирование и декодирование Base62, но тот, который я нашел, основан только на числах, что ограничило бы меня использованием последовательных уникальных идентификаторов пользователя, которые затем создают очевидный последовательный паттерн в закодированных результатах, который можно легко использовать,
Предпочтительно, я хочу решение, которое не потребует от меня изменения БД.
В идеале я хотел бы создать сокращенный URL-адрес, аналогичный тому, как Bit.ly и другие сокращающие URL-адреса создают свои уникальные URL-адреса, но его можно кодировать и декодировать либо на основе идентификатора пользователя, имени пользователя или электронной почты, и предпочтительно иметь кодирование / декодирование "засолено" уникальным ключом, так что в закодированных результатах не появляется шаблон.
ПРИМЕР:
Таким образом, вместо ссылки для подтверждения выглядит так:
http://domain.com/confirm?email=blah@blah.com&hash=1f3870be274f6c49b3e31a0c6728957f
Я хотел бы, чтобы это выглядело так:
http://domain.com/confirm/Sg5rdn
Тогда я просто декодировал бы Sg5rdn, чтобы получить имя пользователя, идентификатор пользователя или адрес электронной почты пользователя и подтвердить их.
Это вообще возможно?
3 ответа
Вместо этого просто создайте таблицу с кодами подтверждения. Когда пользователь должен сделать подтверждение, создайте уникальный код (используя base62 или любой другой), вставьте его в эту таблицу и назначьте его для идентификатора пользователя.
Затем, когда пользователь нажимает на ссылку подтверждения, просто извлеките идентификатор пользователя и т. Д. Из таблицы кодов подтверждения (и убедитесь, что код существует и до сих пор не подтвержден и т. Д.).
Я хотел бы предложить вам сохранить код в столбце в пользовательской таблице: пример таблицы очень сокращен:
id--user---email--------------key-----confirmed----other stuff
1 bob bob@example.com 1h323f 1 ...
2 rob rob@example.com 18gg3f 0 ...
3 steve steve@example.com a862gf 1 ...
4 tom tom@example.com 17g23f 0 ...
Когда пользователь регистрируется в учетной записи, предварительно создайте ключ и сохраните его вместе с именем пользователя и т. Д.
Затем, когда щелкнет ссылка, проверьте наличие ключа в сообщении электронной почты, затем обновите подтвержденное до 1. Вы можете использовать.htaccess для ссылки, чтобы сделать ее еще короче:
RewriteRule ^confirm/(.*)/([a-zA-Z0-9]+)$ confirm.php?email=$1&hash=$2 [L]
например: HTTP://domain.com/confirm/tom@example.com/17g23f
Надеюсь это поможет
Боюсь, ваши ожидания немного преувеличены.
Единственное, что вы можете сделать, это немного сократить хеш.
единственный способ "расшифровать" имя пользователя, идентификатор пользователя и электронную почту из Sg5rdn - это извлечь их все из базы данных.