我正在使用HTML::Mason
,经过最近的安全审核,发现我们的某些软件容易受到标头注入的影响。具体来说session_id
,这与通过GET
和POST
请求传递的参数有关。
我试图handler()
从自定义处理程序修改我的方法中的环境,但是Apache2::RequestRec
已经创建了,所以它不会接受更改。
有没有一种好方法可以在处理程序级别清理所有输入到 HTML::Mason 中?
我正在使用HTML::Mason
,经过最近的安全审核,发现我们的某些软件容易受到标头注入的影响。具体来说session_id
,这与通过GET
和POST
请求传递的参数有关。
我试图handler()
从自定义处理程序修改我的方法中的环境,但是Apache2::RequestRec
已经创建了,所以它不会接受更改。
有没有一种好方法可以在处理程序级别清理所有输入到 HTML::Mason 中?
所以我使用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;
同样,这个选项并不像我想要的那样最佳,但它会起作用。对此“解决方案”的补充和改进也将受到欢迎。