There's an idea I've toyed with for Perl 6's CGI.pm and I think it might prove 
useful for Catalyst:  allow junctions for request parameters.  Consider the 
following:

  # ?sport=football
  my $params = $c->request->query_parameters;
  # { sport => 'football' }

But if there are multiple paramters:

  # ?sport=football;sport=seal%20clubbing
  my $params = $c->request->query_parameters;
  # { sport => [ 'football', 'seal clubbing' ] }

Because multiple parameters are supplied, the data structure changes!  All an 
attacker needs to do is is tack on a duplicate parameter to a query string a 
see if the code crashes.  Worse, if there are already multiple parameters, the 
attacker can restrict them to a single parameters and you'll likely fail when 
you attempt to dereference:

  @ {$params->{sport} }

I think this could be eliminated by using an 'any' junction:

  my $sport = $c->request->get_param('sport');
  if ( 'football' eq $sport ) { ... }

That works whether you have one parameter for 'sport' or multiple.  Want to 
iterate over them?

  foreach my $sport ( $c->request->get_param('sport')->values ) { ... }

Again, that still works whether you have one parameter or several.

The developer no longer needs to write code to detect what data type is 
returned and it's one less bug lurking.

Thoughts?

Cheers,
Ovid
--
Buy the book         - http://www.oreilly.com/catalog/perlhks/
Tech blog            - http://use.perl.org/~Ovid/journal/
Twitter              - http://twitter.com/OvidPerl
Official Perl 6 Wiki - http://www.perlfoundation.org/perl6

_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to