在处理程序中清理HTML :: Mason参数?

时间:2012-04-04 20:19:56

标签: security sanitization mod-perl2 mason

我正在使用HTML::Mason,并且在最近的安全审核之后,发现我们的某些软件容易受到标头注入攻击。具体而言,这与session_id参数有关,该参数通过GETPOST请求传递。

我尝试使用自定义处理程序修改handler()方法中的环境,但Apache2::RequestRec已经创建,因此它不会接收更改。

是否有一种很好的方法可以在处理程序级别清理HTML :: Mason中的所有输入?

1 个答案:

答案 0 :(得分: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;

同样,这个选项不是我想要的最佳选择,但它会起作用。此“解决方案”的增加和增强也将受到欢迎。