[Rio-pm] CGI::Cookie - BUG ?

breno breno em rio.pm.org
Segunda Setembro 15 08:32:27 PDT 2008


Lucas,

Tem toda razão quanto a alertar sobre o uso de caracteres como '+'
dentro de Cookies. Mas não é um bug... da documentação do CGI::Cookie:

------------8<------------
CGI.pm uses the URL escaping methods to save and restore reserved
characters in its cookies. If you are trying to retrieve a cookie set
by a foreign server, this escaping method may trip you up. Use
raw_fetch() instead, which has the same semantics as fetch(), but
performs no unescaping.
------------8<------------

De fato, de dentro do CGI::Cookie.pm, logo abaixo da função fetch()
que vc cita (aliás, exatas duas linhas abaixo da linha que vc colou no
email):

------------8<------------
# Fetch a list of cookies from the environment or the incoming headers and
# return as a hash. The cookie values are not unescaped or altered in any way.
sub raw_fetch {
   ...
------------8<------------

Se alguém quiser armazenar e recuperar dados sem escapar nada, pode
usar o raw_fetch(). Se quiser usar o fetch() para tudo e lidar
especificamente com o problema de algum dado em Base64, pode ver que o
base64 usa apenas 'A'..'Z', 'a'..'z', '0'..'9', '+' e '/' (listado no
link que vc passou), e espaço (' ') não está entre eles. Assim,
"desfazer" a operação para o elemento prejudicado fica tão difícil
quanto um tr/ /+/ (mas realmente exige atenção e é o tipo de problema
difícil de achar, daí a recomendação do raw_fetch().

[]s

-b


2008/9/15 Lucas Mateus <lucasmateus.oliveira em gmail.com>:
> Eu aki mexendo nuns codigos antigos achei um BUG no CGI, a funcao unescape
> que substitui + por ' ' dos valores GET (teste.cgi?nome=joao+mendes) tambem
> é processada no valor do Cookie, isso significa que usando CGI eh bom tomar
> cuidado com os '+' em valores tratados por ele.
>
> --------------------------------------------------------------------------------------------------------------------------------------
>
> CGI.pm 3.42  http://search.cpan.org/~lds/CGI.pm-3.42/CGI.pm
>
> 2782: $self->{'.cookies'} = CGI::Cookie->fetch
> 2783:  unless $self->{'.cookies'};
>
> CGI::Cookie 1.29  http://search.cpan.org/~lds/CGI.pm-3.42/CGI/Cookie.pm
>
> 42: my $raw_cookie = get_raw_cookie(@_) or return;    ## apenas pega o
>  cookie | sub fetch
> 43:  return $class->parse($raw_cookie);                         ## faz o
> parse do cookie   | sub fetch
>
> 101: @values = map unescape($_),split(/[&;]/,$value.'&dmy');  ## A funcao
> unescape vem de CGI::Util::unescape | sub parse
>
> CGI::Util 1.5_01 http://search.cpan.org/~lds/CGI.pm-3.42/CGI/Util.pm
>
> 212:  $todecode =~ tr/+/ /; # pluses become spaces
>
> --------------------------------------------------------------------------------------------------------------------------------------
>
> Isso eh suficiente pra grarantir que o valor do cookie nao pode ter '+',
> algoritmos de criptografia como Digest::MD5::md5_base64
> (http://search.cpan.org/~gaas/Digest-MD5-2.36/MD5.pm#FUNCTIONS) utiliza esse
> caracter.
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>


Mais detalhes sobre a lista de discussão Rio-pm