Как сделать функцию кодирования / декодирования в Base62 без явного шаблона в результатах? - PullRequest
0 голосов
/ 05 сентября 2011

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

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

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

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

Предпочтительно, я хочу решение, которое не потребует от меня изменения БД.

В идеале я хотел бы создать сокращенный URL-адрес, аналогичный тому, как Bit.ly и другиеСокращатели rl создают свои уникальные URL-адреса, но они могут быть закодированы и декодированы либо из идентификатора пользователя, имени пользователя или электронной почты, и предпочтительно имеют кодирование / декодирование, «засоленные» уникальным ключом, чтобы в закодированном коде не возникало шаблонарезультаты.

ПРИМЕР:

Поэтому вместо ссылки для подтверждения, похожей на:

http://domain.com/confirm?email=blah@blah.com&hash=1f3870be274f6c49b3e31a0c6728957f

Я бы хотел, чтобы она выглядела так:

http://domain.com/confirm/Sg5rdn

Где я тогда просто декодировал бы Sg5rdn, чтобы получить имя пользователя, идентификатор пользователя или электронную почту пользователя и подтвердить их.

Возможно ли это?

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

Вместо этого просто создайте таблицу с кодами подтверждения.Когда пользователь должен сделать подтверждение, создайте уникальный код (используя base62 или любой другой), вставьте его в эту таблицу и назначьте его для идентификатора пользователя.

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

1 голос
/ 05 сентября 2011

Я бы предложил вам сохранить код в столбце пользовательской таблицы: пример таблицы очень сокращен:

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

Надеюсь, это поможет

0 голосов
/ 05 сентября 2011

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

единственный способ «декодировать» имя пользователя, идентификатор пользователя и электронную почту из Sg5rdn - это извлечь их все из базы данных.

...