2012-04-04 10 views
1

私はHTML::Masonを使用しています。最近のセキュリティ監査の結果、一部のソフトウェアがヘッダインジェクションに脆弱であることが判明しました。具体的には引数に関連し、これはGETPOST要求を通過します。ハンドラのHTML :: Mason引数をサニタイズしますか?

handler()メソッドの環境をカスタムハンドラから変更しようとしましたが、Apache2::RequestRecが既に作成されているため、変更が反映されません。

HTML :: Masonのすべての入力をハンドラレベルでサニタイズする良い方法はありますか?

+0

Ick、このための指針は[驚くほど楽観的です](http://www.masonbook.com/book/chapter-9.mhtml)です。 [このサイト](http://www.perl.com/pub/2002/02/20/css.html)では、いくつかの追加ガイダンスが提供されています。 ['HTML :: Mason :: CGIHandler'](http://search.cpan.org/~drolsky/HTML-Mason-1.48/lib/HTML/Mason/CGIHandler.pm)を使ってみましたか? – MrGomez

+1

動作しないコードのサンプルを投稿できますか? – benrifkah

+0

はい、 'HTML :: Mason :: DGIHandler'を試しました。これは' POST'と 'GET'データの両方で使用すると問題を引き起こしました。私は動作するパッチを見つけることができましたが、最適なパッチは見つけられません。私はすぐに回答を投稿します。 –

答えて

1

HTML::MasonPluginsを使用してこれを処理しました。これは私が望んでいた解決策ではありません。なぜなら、それらが解析される前に引数をサニタイズしないからです。引数の構文解析に悪用可能なコードがある場合、それでも問題が発生する可能性があります。これは何もないより優れていますが、真の解決策のようには感じられません。 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], 
); 

プラグインコード:$context->argsは重い物を持ち上げるのほとんどを行います。入力を考える:

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

我々は$context->argsで、次を得る:

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

これもPOST要求のために働く、およびHTML ::メイソンの通常の構文解析と同じ規則に従います。実際のプラグインは次のようになります:

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; 

このオプションも、私が望んだほど最適ではありませんが、うまくいきます。この「解決策」の追加や強化も歓迎されるだろう。

関連する問題