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