【问题标题】:Perl web API using Data::Dumper使用 Data::Dumper 的 Perl Web API
【发布时间】:2011-07-21 13:28:52
【问题描述】:

我们使用 Apache 和 mod_perl 开发了一个开放的 Web API,您可以在其中传递由 Data::Dumper 创建的文本以发出请求。

我们的数据通常如下所示:

$VAR1 = {
    'OurField' => 'OurValue'
};

目前,我注意到我们正在使用 eval 将数据返回到 Perl 哈希服务器端:

my $VAR1;
eval $our_dumper_string;
#$VAR1 is now filled with hash value

这个问题是一个主要的安全问题。你可以在那里传递恶意的 perl 代码,它会在服务器端运行......

是否有更好的方法来安全地获取 Data::Dumper 字符串并将其转换为哈希?

【问题讨论】:

    标签: web-services perl mod-perl data-dumper


    【解决方案1】:

    是的。使用 JSON::XS 并使用 JSON 而不是 Data::Dumper 格式。这与其他 Web API 更兼容

    【讨论】:

    • 我们还支持 XML、YAML 和 JSON。这只是我们的 perl 开发人员当前使用的第 4 种格式。我们想继续支持它,b/c 它目前正在使用中......
    • 好吧,我有点突然,我猜这可能是个问题。但是,还有其他问题。首先,您无法真正控制核心模块的功能,因此它们可以更改,除了与 eval 的兼容性。最好的选择可能是 CPAN Safe 模块,它可以关闭 eval 以便它执行一些代码操作。这将使 Data::Dumper 完好无损,但解决了安全问题。
    • 我们将尝试使用 Safe,我认为它看起来是一个不错的选择。
    【解决方案2】:

    如果您的数据简单且可预测,您甚至可以尝试编写一个简单的“解析器”来读回数据结构中的值

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use Data::Dumper;
    
    my $data = { 'key1' => 'value' };
    
    my $dumper = Dumper($data);
    
    print $dumper;
    
    my $data_2;
    
    while( $dumper =~ /(.+)$/mg) {
        if ( $1 =~ m/'(.*)' => '(.*)'/ ) {
            $data_2->{$1} = $2;
        }
    }
    
    print Dumper( $data_2 );
    

    (这只是一个示例,不适用于整数或嵌套数据结构)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多