Мне нужно убедиться, что регулярное выражение , которое передается как пользовательский ввод , не будет случайно завершено и превратится в произвольно Perl-код, но в то же время работает для базовых целей фильтрации.
Важно! Эта часть кода выполняется в режиме , заключенном в тюрьму , что означает, что потенциально она может быть использована только самостоятельно. Кроме того, пользовательский интерфейс доступен только определенному пользователю и потенциально может работать с ограниченным количеством файлов, поэтому потенциальные риски DoS очень минимальны.
Чтобы достичь своей цели, я создал пользовательскую функцию, которая вначале будет заключать все в кавычки, а затем, чтобы символы запускались регулярным выражением, требовался только escape-код.
Пример: * * один тысяча двадцать-одна
# Allow short range of special chars to be left unescaped
# to let regex work, while at the same time prevent possible
# command injection or premature regex termination
my $mask = $in{'mask'};
sub quotemeta_dangerous
{
my ($string) = @_;
$string = quotemeta($string);
$string =~ s/\\\\/\\/g;
$string =~ s/\\\+/+/g;
$string =~ s/\\\*/*/g;
$string =~ s/\\\$/\$/g;
$string =~ s/\\\^/\^/g;
$string =~ s/\\\(/\(/g;
$string =~ s/\\\)/\)/g;
$string =~ s/\\\{/\{/g;
$string =~ s/\\\}/\}/g;
$string =~ s/\\\[/\[/g;
$string =~ s/\\\]/\]/g;
$string =~ s/\\\?/?/g;
$string =~ s/\\\././g;
$string =~ s/\\\-/-/g;
return $string;
}
my $sanitized_mask = quotemeta_dangerous($mask);
if ($filename =~ /$sanitized_mask/) {
# matched
}
Вопросы:
Поможет ли мое решение, приведенное выше, безопасно достичь моих целей, учитывая упомянутые, важные примечания. Каковы потенциальные риски, которые я не вижу здесь?
В качестве побочного, но знакомого вопроса, при последующих работах по замене, можно ли также вводить / использовать деталь replace , и , если она , как безопасно выполнять замены в содержимом соответствующих файлов?
Пример:
$file_contents =~ s/\Q$text_to_find\E/$text_to_replace_with/g;
Можно ли избежать $text_to_replace_with
здесь как угрозу безопасности, когда передается от пользователя как есть?