Passando Estruturas Perl dados como Serialized GET cordas para um programa Perl CGI

StackOverflow https://stackoverflow.com/questions/1812783

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu quero passar uma estrutura de dados Perl serializado como uma variável GET para uma aplicação CGI. Tentei Data :: Serializer como a minha primeira opção. Infelizmente a string serializada é muito longo para o meu conforto, para além de conter opções unidas por '^' (um acento circunflexo).

Existe uma maneira eu posso criar seqüências curtas codificados de estruturas de dados Perl para que eu possa com segurança passá-las como variáveis ??GET para uma aplicação perl CGI?

Eu também gostam de ser dito que este (serializados, cordas codificados) é um mau caminho para passar estruturas de dados complexas para aplicações web e sugestões sobre como eu poderia fazer isso

Foi útil?

Solução

Se você precisa enviar URL de para os usuários que contém alguns pontos de dados chave e você quer garantir que ele não pode ser forjada você pode fazer isso com uma Digest (como de Digest :: SHA) e um segredo compartilhado. Isso permite que você colocar os dados lá fora em suas mensagens sem a necessidade de manter um banco de dados local para acompanhar tudo. Meu exemplo não inclui um elemento de tempo, mas que seria fácil o suficiente para acrescentar, se desejar.

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;

Em seguida, enviá-lo junto.

Em seu "thing.cgi" script que você só precisa extrair os parâmetros e veja se o resumo submetido no script corresponde ao que você localmente regenerado (usando $ email e US $ msg_id, e, claro, o seu $ secreto). Se eles não corresponderem, não autorizá-los, se eles fizerem isso, então você tem um pedido legitimamente autorizado.

Nota de rodapé:
Eu escrevi os métodos "matérias" em Data :: Serializer para fazer a tradução entre serializers muito mais fácil e que na verdade não ajuda com ir entre as línguas (a um ponto). Mas isso, claro, é uma discussão em separado como você realmente não deve nunca usar um serializador para troca de dados em um formulário web.

Outras dicas

Um dos inconvenientes da abordagem - usando um serializador específico-perl, isto é - é que se você quiser se comunicar entre o cliente eo servidor usando algo diferente de perl que provavelmente será mais trabalho do que algo como JSON ou mesmo XML seria. As limitações de tamanho de solicitações GET você já executados em, mas isso é problemático para qualquer esquema de codificação.

É mais provável que seja um problema para o próximo cara na estrada que mantém este código do que é para você. Eu tenho uma situação agora onde um desenvolvedor que trabalhou em um sistema grande antes de eu tinha decidido para armazenar vários bits importantes de dados como perl objetos que podem ser guardadas. Não uma decisão horrível em si, mas está tornando mais difícil do que deveria ser para acessar os dados com ferramentas que não são escritos em perl.

Passando cordas serializados codificado é um mau caminho para passar estruturas de dados complexos para aplicações web.

sessões

Se você está tentando passar estado de página para página, você pode usar lado do servidor que só seria necessário que você passar em torno de uma chave de sessão.

Se você precisar enviar e-mail um link para alguém, você ainda pode criar uma sessão do lado do servidor com um tempo de expiração razoável (você também precisa decidir se a autenticação adicional é necessário) e, em seguida, enviar o ID da sessão na ligação . Você pode / deve terminar a sessão imediatamente uma vez que a ação solicitada seja tomada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top