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

Lucas Mateus lucasmateus.oliveira em gmail.com
Segunda Setembro 15 10:14:46 PDT 2008


Acho q a melhor opção eh passar o valor da sessao para hexadecimal depois  
do algoritmo de criptografia, isso deve garantir melhor a funcionalidade  
correta da aplicação para esse caso.

Em Mon, 15 Sep 2008 12:32:27 -0300, breno <breno em rio.pm.org> escreveu:

> 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
>>
> _______________________________________________
> 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