Как сделать функцию кодирования / декодирования в 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 - это извлечь их все из базы данных.

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