You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Kurt George Gjerde <ku...@intermedia.uib.no> on 2007/05/24 11:58:33 UTC

Module proposal: CGI::Cookie::Protected

Hi,

Grateful for any feedback on the module podded below. Is the name ok or 
should I perhaps change to CGI::Cookie::Fingerprint or something else?

Thanks,
-Kurt.


NAME
     CGI::Cookie::Protected - Cookies with fingerprint

SYNOPSIS
         use CGI qw(:standard);
         use CGI::Cookie::Protected;

         # Create a new protected cookie and send it
         my $cookie = CGI::Cookie::Protected->new(
                       -name=>'ID', -value=>1234
                      );
         $cookie->protect($privake_key);
         print header( -cookie=>$cookie );

         # Fetch existing cookie and unprotect it
         my %cookies = CGI::Cookie::Protected->fetch();
         my $id_cookie = $cookies{ID};
         $id_cookie->unprotect($private_key);
         $id = $id_cookie->value();

         # Fetch existing cookie and validate it
         my %cookies = CGI::Cookie::Protected->fetch();
         my $id_cookie = $cookies{ID};
         if ($id_cookie->validate($private_key)) {
           print "Cookie OK";
         } else {
           die "Cookie not OK";
         }

DESCRIPTION
     CGI::Cookie::Protected is a subclass of CGI::Cookie. It provides the
     ability of adding a fingerprint to the cookie, preventing the client
     from altering the cookie's value(s).

NEW METHODS
   protect($private_key)
     Adds a fingerprint to the cookie. If the cookie's value is altered 
after
     calling protect() you will have to call protect() again.

   unprotect($private_key, ...)
     Removes the fingerprint from the cookie. This should be called before
     retrieving the cookie's value(s). If the fingerprint does not validate
     against the $private_key, the cookie's value becomes undefined. On
     success this method returns 1.

   validate($private_key, ...)
     If the cookie's fingerprint validates against the $private_key, this
     method returns 1, otherwise it returns 0.

ABOUT THE PRIVATE KEY(S)
     The unprotect() and validate() methods can take an list of private keys
     and will return success if any of the keys validate against the cookie.
     This might be useful in a key rotation scenario, where you can validate
     against the new key and the previous key.

     The resulting cookie string (of name=mycookie and value=myvalue) might
     look like this:

       mycooke=myvalue&ab34e32fbb12839adde21234dd824ca7; path=/

     The current implementation uses MD5 to generate the fingerprint.


Re: Module proposal: CGI::Cookie::Protected

Posted by Perrin Harkins <pe...@elem.com>.
On 5/24/07, Kurt George Gjerde <ku...@intermedia.uib.no> wrote:
>      The current implementation uses MD5 to generate the fingerprint.

Probably a good idea to use SHA1 instead at this point.

- Perrin

Re: Module proposal: CGI::Cookie::Protected

Posted by John ORourke <jo...@o-rourke.org>.
Check out a similar module I wrote last year for mod_perl:

http://www.versatilia.com/downloads/Apache2/Cookie/Validated.pm

It's designed to store simple hashes.

I still haven't got around to putting it on CPAN but have been using it 
happily for 18 months and it has a couple of features you might like to 
borrow:

    - a 'del' method to make cookie deletion easy
    - strips path attribute quotes for older browser compatibility

cheers
John

Kurt George Gjerde wrote:
> Hi,
>
> Grateful for any feedback on the module podded below. Is the name ok 
> or should I perhaps change to CGI::Cookie::Fingerprint or something else?
>
> Thanks,
> -Kurt.
>
>
> NAME
>     CGI::Cookie::Protected - Cookies with fingerprint
>
> SYNOPSIS
>         use CGI qw(:standard);
>         use CGI::Cookie::Protected;
>
>         # Create a new protected cookie and send it
>         my $cookie = CGI::Cookie::Protected->new(
>                       -name=>'ID', -value=>1234
>                      );
>         $cookie->protect($privake_key);
>         print header( -cookie=>$cookie );
>
>         # Fetch existing cookie and unprotect it
>         my %cookies = CGI::Cookie::Protected->fetch();
>         my $id_cookie = $cookies{ID};
>         $id_cookie->unprotect($private_key);
>         $id = $id_cookie->value();
>
>         # Fetch existing cookie and validate it
>         my %cookies = CGI::Cookie::Protected->fetch();
>         my $id_cookie = $cookies{ID};
>         if ($id_cookie->validate($private_key)) {
>           print "Cookie OK";
>         } else {
>           die "Cookie not OK";
>         }
>
> DESCRIPTION
>     CGI::Cookie::Protected is a subclass of CGI::Cookie. It provides the
>     ability of adding a fingerprint to the cookie, preventing the client
>     from altering the cookie's value(s).
>
> NEW METHODS
>   protect($private_key)
>     Adds a fingerprint to the cookie. If the cookie's value is altered 
> after
>     calling protect() you will have to call protect() again.
>
>   unprotect($private_key, ...)
>     Removes the fingerprint from the cookie. This should be called before
>     retrieving the cookie's value(s). If the fingerprint does not 
> validate
>     against the $private_key, the cookie's value becomes undefined. On
>     success this method returns 1.
>
>   validate($private_key, ...)
>     If the cookie's fingerprint validates against the $private_key, this
>     method returns 1, otherwise it returns 0.
>
> ABOUT THE PRIVATE KEY(S)
>     The unprotect() and validate() methods can take an list of private 
> keys
>     and will return success if any of the keys validate against the 
> cookie.
>     This might be useful in a key rotation scenario, where you can 
> validate
>     against the new key and the previous key.
>
>     The resulting cookie string (of name=mycookie and value=myvalue) 
> might
>     look like this:
>
>       mycooke=myvalue&ab34e32fbb12839adde21234dd824ca7; path=/
>
>     The current implementation uses MD5 to generate the fingerprint.
>
>