2012-04-04 6 views
1

Ich benutze HTML::Mason, und nach einer kürzlichen Sicherheits-Audit wurde festgestellt, dass einige unserer Software anfällig für eine Header-Injektion ist. Insbesondere bezieht sich dies auf das session_id Argument, das durch GET und POST Anfragen weitergegeben wird.Sanitize HTML :: Mason Argumente im Handler?

Ich habe versucht, die Umwelt in meiner handler() Methode von einem benutzerdefinierten Handler zu ändern, aber die Apache2::RequestRec ist bereits erstellt, so dass er die Änderungen nicht abholen.

Gibt es eine gute Möglichkeit, alle Eingaben in HTML :: Mason auf der Handler-Ebene zu bereinigen?

+0

Ick, die zur Verfügung gestellte Anleitung dafür [ist überraschend optimistisch] (http://www.masonbook.com/book/chapter-9.mhtml). [Diese Seite] (http://www.perl.com/pub/2002/02/20/css.html) bietet einige zusätzliche Anleitungen. Haben Sie versucht, ['HTML :: Mason :: CGIHandler'] (http://search.cpan.org/~drolsky/HTML-Mason-1.48/lib/HTML/Mason/CGIHandler.pm) zu verwenden? – MrGomez

+1

Können Sie ein minimales Code-Beispiel posten, das nicht funktioniert? – benrifkah

+0

Ja, ich habe versucht 'HTML :: Mason :: DGIHandler' und es verursachte Probleme bei der Verwendung mit beiden' POST' und 'GET' Daten. Ich konnte einen funktionierenden Patch finden, finde ihn aber nicht optimal. Ich werde die Antwort in Kürze veröffentlichen. –

Antwort

1

Also habe ich das mit HTML::MasonPlugins ausgearbeitet. Dies ist nicht die Lösung, auf die ich gehofft hatte, da es die Argumente nicht bereinigt, bevor sie geparst werden, sondern danach. Wenn beim Parsen von Argumenten ein auswertbares Stück Code vorhanden ist, kann es dennoch Probleme verursachen. Das ist besser als nichts, aber es fühlt sich nicht wie eine echte Lösung an.

Hinzufügen von Plugins zum ApacheHandler:

my $ah = HTML::Mason::ApacheHandler->new (
    ... 
    session_use_cookie   => 0, 
    args_method     => "mod_perl", 
    session_args_param   => 'session_id', 
    plugins      => [PolMaker::Plugins::SanitizeArgs->new], 
); 

Plugin Code:$context->args hat die meisten schweres Heben. In Anbetracht der Eingabe:

?session_id=c45a0309191691cd5b4714c936d0f9a2&foo=bar&baz=pop 

wir folgende erhalten in $context->args:

['session_id', 'c45a0309191691cd5b4714c936d0f9a2', 'foo', 'bar', 'baz', 'pop'] 

Dies funktioniert auch für POST Anforderungen und folgt den gleichen Regeln wie HTML :: Mason normalen Parsing. Die eigentliche Plugin sieht wie folgt aus:

package PolMaker::Plugins::SanitizeArgs; 
use base qw(HTML::Mason::Plugin); 

my %SANITIZE = (  
     "session_id" => 1, 
     ## Room for future expansion. 
    ); 

sub start_request_hook { ## Executes once per request. 
    my $self = shift; 
    my $context = shift; 
    my @clean_args; 
    my $next = 0; 
    foreach my $arg (@{ $context->args }) { 
     if (defined($SANITIZE{$arg})) { 
      $next = 1; 
     } elsif ($next > 0) { 
      $arg =~ s/[^\w \d\-\.]//g; # Leave words, digits, dashes and periods. 
      $next = 0; 
     } 
     push @clean_args, $arg; 
    } 
    @{$context->args} = @clean_args; 
} 
1; 

Auch diese Option nicht so optimal ist, wie ich wollte, aber es wird funktionieren. Ergänzungen und Erweiterungen dieser "Lösung" wären ebenfalls zu begrüßen.

Verwandte Themen