Как дезинфицировать ввод из открытых файлов в Perl

У меня есть сценарий Perl, который открывает файл, обрабатывает его и печатает некоторый вывод. Входной файл сжат gzip.

путь к $file передается скрипту в качестве аргумента.

Ниже приведено текущее решение, которое я использую:

open(my $fh, "-|", "$gzcat $file") or die("Cannot open $file$!");

Недавно сценарий не прошел проверку безопасности Checkmarx со следующей ошибкой:

<script> gets user input for the $fh element. This element’s value then flows through the code without being properly sanitized or validated and is eventually displayed to the user in method <method>. This may enable a CrossSite-Scripting attack.

Я попытался проверить существование файла с помощью perl -f, а также удалить ненужные символы с помощью $file =~ s/[^A-Za-z0-9_\-\.\/]//g;, но это не удовлетворяет Checkmarx.

Я хотел бы знать, как правильно дезинфицировать ввод, содержащий путь к файлу в Perl.


person Emil Gelman    schedule 31.01.2020    source источник
comment
Похоже, вам срочно нужно правильное экранирование оболочки. Никогда не выгружайте пользовательский ввод в аргумент оболочки без надлежащего экранирования.   -  person tadman    schedule 31.01.2020
comment
@tadman Ввод предоставляется другим приложением, работающим на сервере, которое генерирует имя файла.   -  person Emil Gelman    schedule 31.01.2020
comment
Вы все еще не можете поверить, что $file безвреден или лишен символов оболочки. Например $file = "a space.txt" не подойдет.   -  person tadman    schedule 31.01.2020


Ответы (2)


Пока вы используете Perl 5.8 или новее в ОС, поддерживающей разветвление, или 5.22 или новее в Windows, вы можете использовать форму списка open для обхода оболочки при выполнении вашей команды. Это позволяет избежать проблем, когда имя файла содержит метасимволы, которые интерпретирует оболочка, например & и пробелы.

open(my $fh, "-|", $gzcat, $file) or die("Cannot open $file: $!");

Однако это не проверка или дезинфекция, как требуется, но важно избегать как уязвимостей, так и неправильного поведения. Упомянутая возможность межсайтового скриптинга связана с отображаемым именем файла, как упоминалось ниже; например, если он отображается на HTML-странице, вы должны экранировать его в HTML, у большинства систем шаблонов есть методы для этого.

person Grinnz    schedule 31.01.2020
comment
Само имя файла не печатается, печатается только содержимое файла. HTML-экранирование пути к файлу испортит сам путь, например косые черты в пути, которые будут переведены в %2F - person Emil Gelman; 31.01.2020

В итоге я удалил ненужные символы с помощью

$file =~ s/[^A-Za-z0-9_\-\.\/]//g;

Проверка существования файла с помощью Perl -f и открытие файла с помощью IO::Uncompress::Gunzip.

Это проходит аудит Checkmarx.

person Emil Gelman    schedule 06.02.2020
comment
Я расскажу об этом в главе Mastering Perl, посвященной методам безопасного программирования. Вы можете испортить данные, поступающие из дескриптора файла, и сделать то же, что и вы, чтобы их не испортить. Другой способ сказать «удаление нежелательных» — это «сохранение разыскиваемых»; разница между тем, что Марк Джейсон Доминус называет американским и прусским подходами. - person brian d foy; 06.02.2020