[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