1

私はを使用してHTML::Masonいますが、最近のセキュリティ監査の結果、一部のソフトウェアがヘッダーインジェクションに対して脆弱であることが判明しました。具体的にはsession_id、これは引数に関連しており、引数は渡されてGET要求されPOSTます。

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

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

4

1 に答える 1

1

そこで、HTML::Mason Pluginsを使用してこれを解決しました。これは、引数が解析される前にサニタイズされないため、私が望んでいた解決策ではありません。引数の解析に悪用可能なコードがある場合でも、問題が発生する可能性があります。これは何もないよりはましですが、真の解決策とは思えません。

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::Mason の通常の解析と同じ規則に従います。実際のプラグインは次のようになります。

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;

繰り返しますが、このオプションは私が望んでいたほど最適ではありませんが、機能します。この「ソリューション」への追加と拡張も歓迎されます。

于 2012-04-11T21:17:41.930 に答える