This answer解释了要验证任意正则表达式,只需使用eval:
while (<>) { eval "qr/$_/;" print $@ ? "Not a valid regex: $@\n" : "That regex looks valid\n"; }
然而,这让我感到非常不安全,因为我希望这是显而易见的原因.有人可以输入,说:
foo/; system(‘rm -rf /’); qr/
或者他们可以设计的任何狡猾的计划.
防止这种事情的自然方法是逃避特殊字符,但如果我逃避了太多字符,我首先严重限制了正则表达式的用处.我相信,至少[] {}()/ –,.*?^ $可以提出强有力的论据!在用户正则表达式界面中,应该允许(并且可能是其他的)未转义的空白字符,以使正则表达式具有最小的实用性.
是否有可能在不限制正则表达式语言有用性的情况下保护自己不受正则表达式注入的影响?