Если вам нужно отправить URL своим пользователям, которые содержат несколько ключевых точек данных, и вы хотите убедиться, что они не могут быть подделаны, вы можете сделать это с помощью дайджеста (например, из Digest :: SHA) и общего секрета. Это позволяет помещать данные в свои сообщения без необходимости хранить локальную базу данных для отслеживания всего этого. Мой пример не включает элемент времени, но его было бы достаточно легко добавить, если хотите.
use Digest::SHA qw(sha1_base64);
my $base_url = 'http://example.com/thing.cgi';
my $email = 'guy@somewhere.com';
my $msg_id = '123411';
my $secret = 'mysecret';
my $data = join(":", $email, $msg_id, $secret);
my $digest = sha1_base64($data);
my $url = $base_url . '?email=' . $email . '&msg_id=' . $msg_id' . '&sign=' . $digest;
Тогда пошлите это.
В вашем скрипте "thing.cgi" вам просто нужно извлечь параметры и посмотреть, соответствует ли дайджест, представленный в скрипте, тому, который вы локально регенерируете (используя $ email, $ msg_id и, конечно, ваш $ secret). Если они не совпадают, не авторизуйте их, если они есть, у вас есть законно авторизованный запрос.
Сноска:
Я написал «сырые» методы в Data :: Serializer, чтобы упростить перевод между сериализаторами, и это на самом деле помогает переходить между языками (в точку). Но это, конечно, отдельное обсуждение, так как вам никогда не следует использовать сериализатор для обмена данными в веб-форме.