/ abcd ^ $/i匹配Perl中的任何内容吗?

Ran*_*e42 3 regex perl

Perl是我从来没有完全理由进入的事情之一.不幸的是,我有一个非常具体的(看起来像我的错误)一点Perl代码,我需要定义它的操作可证明.

这段代码已经编写完成,我希望将其删除.

我相信成功匹配是不可能的,但这是对主题(特别是我的)的猜测不够好的事情之一.它正在守护一个代码块{},不幸的是它具有多个条件,所以无论这个表达式的状态如何都可以输入,但是如果确实发生了这个问题就会出现安全问题(如果状态未定义,则本身存在错误恕我直言,但是o证明影响/严重程度较低(读取永远不会得到修复)).

是否有可能/abcd^$/i,匹配成功?包括空字节插入或任何可能的字节/二进制数据?我甚至会进行一些疯狂的环境攻击(例如,在1个字节内消耗主机上的所有内存,导致Perl表达式评估程序在运行时未经检查的2字节分配失败).感谢创造力.

Ins*_*lah 6

从perlre手册页:

但是,您可能希望将字符串视为多行缓冲区,以使"^"在字符串中的任何换行符后匹配(除非换行符是字符串中的最后一个字符),并且"$"将在换行之前匹配.以更多开销为代价,您可以通过在模式匹配运算符上使用/ m修饰符来完成此操作.(较旧的程序通过设置$*来完成此操作,但这种做法已在perl 5.9中删除.)

因此,请确保$*或其他预定义变量不会干扰.

也就是说,即使像/ abcd ^ $/im这样的$*修饰表达式(注意添加的"m"标志)也不会匹配任何内容,因为"^"字符仅在换行符后匹配.


另外,请确保正则表达式不会过载.如果导入的包执行类似这样的操作:

use overload;                                                                   
sub import {                                                                    
    overload::constant(qr => sub { $_ = shift; s/^abcd//; $_ });                 
} 
Run Code Online (Sandbox Code Playgroud)

然后空字符串将匹配您的正则表达式.


另外,不知道正则表达式是如何出现在你的代码中的,并且它可能不相关,但为了安全起见,你不应该隐式匹配$ _而是明确地指定变量:"$ str =〜/ abcd ^ $/i;".

$ _是动态范围的,所以如果你有任何函数调用可以在你定义它的地方和正则表达式之间修改$ _,或者如果你以后添加它们,你会有惊喜:)