【问题标题】:Variable substitution/expansion - safe way in perl变量替换/扩展 - perl 中的安全方式
【发布时间】:2013-05-07 22:29:04
【问题描述】:

我需要一种非常简单的基于行(空格分隔)的“语言”,通常会寻找一些预定义的“动作”(第一个字段),并使用参数(行中的其他字段)执行定义的 perl subs .

许多操作之一是“定义变量值”应该在接下来的操作中使用。

代码片段(输入在DATA中):

use 5.012;
use strict;
use warnings;
use Data::Dumper;

my $VARS;
while(my $line = <DATA>) {
    chomp $line;
    next unless ($line =~ m/^\s*(def|echo|SOME|OTHER|ACTIONS|HERE)\s+(.*)/ );
    my $action = $1;
    my $args = $2;
    my(@fld) = split /\s+/, $args;
    for ($action) {
        when (/^def$/) { $VARS->{$fld[0]} = expandvars($fld[1]); } #expand and store
        when (/^echo$/) { say expandvars($args); }  #echo
    }
    #say Dumper($VARS);
}

sub expandvars {
    my($str) = @_;
    if( $str =~ /\$\{(\w+?)\}/ ) {
        ##############################################
        #is this SAFE or Dangerous? 
        $str =~ s/\$\{(\w+?)\}/$VARS->{$1}/xeg;
        ##############################################
    }
    return $str;
}
__DATA__
#"action" define aaa
def aaa somestring

#define bbb
def bbb ===${aaa}===

#echo 
echo this is ${bbb} here

#here will continue another "actions", but they're
#not needed for the question

程序正在运行(可能远非“最佳”),给出了想要的结果

this is ===somestring=== here

但我的问题是:

我如何替换变量SAFE?那么,如果用户给出一些其他的行(程序将从标准输入中读取它们)是否有可能构造一些危险的东西?上述方式对于变量扩展是否合理安全?或者如果它是错误的,我可以在哪里学习正确的方法? :)

【问题讨论】:

    标签: perl code-injection substitution


    【解决方案1】:

    攻击者必须将字符放在右括号中或打开新括号。如果你把它缩小到单词字符,我看不出它怎么会不安全。

    顺便说一句,您可以通过将捕获表达式设置为变量名称的实心+ 来加快您的正则表达式。如果遇到紧密卷曲,则不会在指定 \w 的情况下使用它。

    s/\$\{(\w+)\}/$VARS->{$1}/xeg;
    

    【讨论】:

      【解决方案2】:

      从某种意义上说,您的代码是安全的,因为我看不到任何注入攻击的方法。然而,这并不是一种特别精心设计的模板语言:

      def .   invisible
      def var no-vars-with spaces
      echo ${.}
      echo ${var}
      

      应该输出

      ${.}
      no-vars-with
      

      您的代码可能会被更好地分解,但这在很大程度上是无关紧要的。

      在这种情况下,替换上的 /e 标志没有任何作用:qq/$var/$var 之间实际上没有区别。

      【讨论】:

        猜你喜欢
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多