Как мне использовать File :: Find :: Rule в режиме taint?

StackOverflow https://stackoverflow.com/questions/434149

  •  10-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь получить список подкаталогов в данном каталоге, используя что-то вроде следующего:

#!/usr/bin/perl -wT
use strict;
use warnings;

use File::Find::Rule;
use Data::Dumper;

my @subdirs = File::Find::Rule->maxdepth(1)->directory->relative->in('mydir');

print Dumper(@subdirs);

Однако выполнение этого дает результат:

  

Небезопасная зависимость в chdir при работе с ключом -T

Я понимаю, что File :: Find имеет варианты работы с режимом taint, но я не могу найти эквивалент в File :: Find :: Rule . Возможно ли сделать выше? Должен ли я использовать альтернативный метод для перечисления подкаталогов? Полностью ли я неправильно понимаю что-то очевидное, что я действительно должен понимать в режиме «портить»?

Это было полезно?

Решение

( Изменить !) Хорошо, логика подсказывает, что сработает следующее:

->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )

Это позволяет вам использовать функции режима taint в File :: Find, передавая аргументы непосредственно в функцию find () этого модуля. Кстати, File :: Find упоминает, что нужно установить $ untaint_pattern с помощью оператора qr // . Например, значением по умолчанию является

$untaint_pattern = qr|^([-+@\w./]+)$|

Однако это не работает! На самом деле ваша проблема - известная ошибка в File :: Find :: Rule. (Например, вот CPAN и Debian сообщает об ошибках.) Если вы хотите исправить ошибку, то оба эти сообщения об ошибках имеют исправления.

Если вы находитесь в ограниченной среде, вы можете по существу внедрить патч в свой код. Например, если вы хотите сохранить все в одном файле, вы можете добавить большой блок кода ниже после того, как используете File :: Find :: Rule . Обратите внимание, что это очень быстрое решение и может быть неоптимальным. Если это не работает для вас (например, из-за того, что в ваших именах файлов есть пробелы), измените шаблон qr | ^ ([- + @ \ w ./]+)$ | , который используется .

Наконец, обратите внимание, что если вы хотите, чтобы ваша организация кода была немного лучше, вы можете захотеть поместить ее в отдельный пакет, возможно, с именем MyFileFindRuleFix или чем-то, что вы всегда используете после Сам файл :: Find :: Rule .

package File::Find::Rule;
no warnings qw(redefine);
sub in {
    my $self = _force_object shift;

    my @found;
    my $fragment = $self->_compile( $self->{subs} );
    my @subs = @{ $self->{subs} };

    warn "relative mode handed multiple paths - that's a bit silly\n"
      if $self->{relative} && @_ > 1;

    my $topdir;
    my $code = 'sub {
        (my $path = $File::Find::name)  =~ s#^(?:\./+)+##;
        $path = "." if ($path eq ""); # See Debian bug #329377
        my @args = (

( Изменить !) Хорошо, логика подсказывает, что сработает следующее:

->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )

Это позволяет вам использовать функции режима taint в File :: Find, передавая аргументы непосредственно в функцию find () этого модуля. Кстати, File :: Find упоминает, что нужно установить $ untaint_pattern с помощью оператора qr // . Например, значением по умолчанию является

$untaint_pattern = qr|^([-+@\w./]+)$|

Однако это не работает! На самом деле ваша проблема - известная ошибка в File :: Find :: Rule. (Например, вот CPAN и Debian сообщает об ошибках.) Если вы хотите исправить ошибку, то оба эти сообщения об ошибках имеют исправления.

Если вы находитесь в ограниченной среде, вы можете по существу внедрить патч в свой код. Например, если вы хотите сохранить все в одном файле, вы можете добавить большой блок кода ниже после того, как используете File :: Find :: Rule . Обратите внимание, что это очень быстрое решение и может быть неоптимальным. Если это не работает для вас (например, из-за того, что в ваших именах файлов есть пробелы), измените шаблон qr | ^ ([- + @ \ w ./]+)$ | , который используется .

Наконец, обратите внимание, что если вы хотите, чтобы ваша организация кода была немного лучше, вы можете захотеть поместить ее в отдельный пакет, возможно, с именем MyFileFindRuleFix или чем-то, что вы всегда используете после Сам файл :: Find :: Rule .

<*>, $File::Find::dir, $path); my $maxdepth = $self->{maxdepth}; my $mindepth = $self->{mindepth}; my $relative = $self->{relative}; # figure out the relative path and depth my $relpath = $File::Find::name; $relpath =~ s{^\Q$topdir\E/?}{}; my $depth = scalar File::Spec->splitdir($relpath); #print "name: \'$File::Find::name\' "; #print "relpath: \'$relpath\' depth: $depth relative: $relative\n"; defined $maxdepth && $depth >= $maxdepth and $File::Find::prune = 1; defined $mindepth && $depth < $mindepth and return; #print "Testing \'

( Изменить !) Хорошо, логика подсказывает, что сработает следующее:

->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )

Это позволяет вам использовать функции режима taint в File :: Find, передавая аргументы непосредственно в функцию find () этого модуля. Кстати, File :: Find упоминает, что нужно установить $ untaint_pattern с помощью оператора qr // . Например, значением по умолчанию является

$untaint_pattern = qr|^([-+@\w./]+)$|

Однако это не работает! На самом деле ваша проблема - известная ошибка в File :: Find :: Rule. (Например, вот CPAN и Debian сообщает об ошибках.) Если вы хотите исправить ошибку, то оба эти сообщения об ошибках имеют исправления.

Если вы находитесь в ограниченной среде, вы можете по существу внедрить патч в свой код. Например, если вы хотите сохранить все в одном файле, вы можете добавить большой блок кода ниже после того, как используете File :: Find :: Rule . Обратите внимание, что это очень быстрое решение и может быть неоптимальным. Если это не работает для вас (например, из-за того, что в ваших именах файлов есть пробелы), измените шаблон qr | ^ ([- + @ \ w ./]+)$ | , который используется .

Наконец, обратите внимание, что если вы хотите, чтобы ваша организация кода была немного лучше, вы можете захотеть поместить ее в отдельный пакет, возможно, с именем MyFileFindRuleFix или чем-то, что вы всегда используете после Сам файл :: Find :: Rule .

<*>\'\n"; my $discarded; return unless ' . $fragment . '; return if $discarded; if ($relative) { push @found, $relpath if $relpath ne ""; } else { push @found, $path; } }'; #use Data::Dumper; #print Dumper \@subs; #warn "Compiled sub: '$code'\n"; my $sub = eval "$code" or die "compile error '$code' $@"; my $cwd = getcwd; # Untaint it if ( $cwd =~ qr|^([-+@\w./]+)$| ) { $cwd = $1; } else { die "Couldn't untaint \$cwd: [$cwd]"; } for my $path (@_) { # $topdir is used for relative and maxdepth $topdir = $path; # slice off the trailing slash if there is one (the # maxdepth/mindepth code is fussy) $topdir =~ s{/?$}{} unless $topdir eq '/'; $self->_call_find( { %{ $self->{extras} }, wanted => $sub }, $path ); } chdir $cwd; return @found; } use warnings; package main;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top