Передача структур данных Perl в виде сериализованных строк GET в программу Perl CGI - PullRequest
1 голос
/ 28 ноября 2009

Я хочу передать сериализованную структуру данных Perl как переменную GET приложению CGI. Я попробовал Data :: Serializer в качестве первого варианта. К сожалению, сериализированная строка слишком длинна для моего удобства, в дополнение к опциям, к которым присоединяется '^' (каретка).

Есть ли способ, которым я могу создавать короткие закодированные строки из структур данных perl, чтобы я мог безопасно передавать их как переменные GET в приложение Perl CGI?

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

Ответы [ 3 ]

1 голос
/ 28 ноября 2009

Один из недостатков подхода & mdash; используя специфичный для Perl сериализатор, то есть & mdash; в том, что если вы когда-нибудь захотите общаться между клиентом и сервером, используя что-то отличное от Perl, это, вероятно, будет более трудоемким, чем что-то вроде JSON или даже XML. Ограничения размера запросов GET, к которым вы уже выполнялись, но это проблематично для любой схемы кодирования.

Скорее всего, это проблема для следующего парня, который поддерживает этот код, чем для вас. У меня возникла ситуация, когда разработчик, который работал над большой системой до того, как я это сделал, решил сохранить несколько важных фрагментов данных в виде хранимых объектов perl. Само по себе это не ужасное решение, но оно затрудняет доступ к данным с помощью инструментов, не написанных на Perl.

1 голос
/ 29 ноября 2009

Если вам нужно отправить 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, чтобы упростить перевод между сериализаторами, и это на самом деле помогает переходить между языками (в точку). Но это, конечно, отдельное обсуждение, так как вам никогда не следует использовать сериализатор для обмена данными в веб-форме.

1 голос
/ 28 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...