Как очистить EDITOR и т. Д. Переменные среды? - PullRequest
2 голосов
/ 15 декабря 2010

У меня есть следующий код, но я думаю, что мне нужно санировать переменные env, но я не уверен, как именно я должен их санироватьЯ понимаю, что есть предел того, сколько я могу их дезинфицировать, но что я могу сделать?

#!/usr/bin/perl
use 5.012;
use warnings;
use autodie;
use Env qw( EDITOR VISUAL );
use File::Temp qw( :seekable );

my $editor = '/usr/bin/nano';
if ( $VISUAL ) {
    $editor = $VISUAL;
}
elsif ( $EDITOR ) {
    $editor = $EDITOR;
} else {
    warn 'set VISUAL and EDITOR env variables not set falling back to nano'
    . "\n";
}

my $tmpf = File::Temp->new;

system $editor, $tmpf->filename;

open $tmpf, '<', $tmpf->filename;

print while ( <$tmpf> );

Ответы [ 4 ]

1 голос
/ 16 декабря 2010

Я думаю, вы должны думать об этом немного по-другому.В конце концов, ваш скрипт требует взаимодействия с пользователем.Поэтому было бы неразумно спросить пользователя, какой редактор использовать.Вы можете выдать запрос прямо перед запуском редактора, как в:

Which editor would you like to use [/usr/bin/vi]?

, где значение по умолчанию будет заполнено из $ENV{EDITOR}, $ENV{VISUAL} илиесли ни один из них не определен, /usr/bin/nano.Таким образом, пользователь может судить, имеет ли значение значение.

Если вы параноидально понимаете, куда указывает $ENV{EDITOR}, вам также может понадобиться параноидально по поводу того, мог ли кто-то разместить вредоносный исполняемый файл на пути пользователяи назвал его greateditor или что-то подобное.

1 голос
/ 15 декабря 2010

Зачем вам вообще их дезинфицировать? Какой урон будет, если у пользователя вашего скрипта есть VISUAL="rm -f" и РЕДАКТОР для чего-то еще странного? Вы будете проверять, что операция редактора прошла успешно, что файл был открыт и что его содержимое имело смысл после редактирования, прежде чем вы сделали что-нибудь опасное. Но если пользователь может только повредить свои собственные файлы (вы не используете систему, в которой они могут повредить ваши файлы, не так ли?), Тогда нет большой необходимости их дезинфекции. Предоставление дефолта разумно; местные обстоятельства диктуют, является ли nano лучшим выбором, чем, скажем, vim.

Если пользователь не может повредить ваши вещи, злоупотребляя VISUAL и РЕДАКТОРОМ, то я бы не стал сильно беспокоиться о том, что они решили повредить свои вещи.

Если вы пишете что-то, что будет работать с повышенными привилегиями - например, с привилегиями SetUID или SetGID - тогда вам придется побеспокоиться об этом. (В коде Perl отсутствуют проверки, которые являются более фундаментальными, чем беспокойство по поводу использования редактора. О, но это use autodie; означает, что скрипт автоматически прерывает работу при ошибках. Для меня это немного радикально. Но это вероятно, извиняет вас - хотя я отмечаю, что он не обрабатывает system или exec, если у вас нет use autodie qw(:all);)

1 голос
/ 15 декабря 2010

Я только когда-либо делал что-то подобное в CGI-скриптах, так что, возможно, это совсем не то, что вы ищете;Я просто надеюсь, что это немного поможет.Вот модифицированная версия выбора разрешенных символов, которые я использовал, и предложение кода:

   my $editor = '/usr/bin/nano';
   my $allowed = 'a-zA-Z0-9.\-_/';

   # this is what I did, but you will probably not want to do this... 
   #$file =~ s/[^$allowed]//go; # Remove every character thats NOT in the OK-list

   # check that the variables contain only allowed characters
   if ($VISUAL =~ m/^[$allowed]+$/) {
      $editor = $VISUAL;
   }
   elsif ($EDITOR =~ m/^[$allowed]+$/) {
      $editor = $EDITOR;
   } 
   else {
      # message
   }

   # The code I have given above should also leave $editor in its default
   # state if neither $VISUAL nor $EDITOR has been set, as the condition
   # will not be true for empty strings/undef values.

Очевидно, что вы не можете изменить переменные окружения, если заметите в них символы, которых, по вашему мнению, там быть не должно (т. е. символы, которых нет в строке $ допускается), но вы можете проверить наличие таких символов и в таком случае воспользоваться вашим редактором по умолчанию.Это всего лишь мое скромное предложение;возможно, эксперт по теме ответит через некоторое время, и вы получите ее / его мудрость на серебряном блюде:)

0 голосов
/ 15 декабря 2010

Использование system с более чем одним аргументом не требует никакой дезинфекции, потому что не будет вызвана оболочка.Возможно, вы захотите проверить, существует ли исполняемый файл первым, но это излишне усложнит вашу программу, и вам придется заглянуть в $PATH.Кроме того, переменным среды, подобным этим, в целом доверяют.

Возможно, вы захотите вызвать состояние выхода из системы.И вы могли бы сначала попытаться вызвать $VISUAL, а в случае сбоя - $EDITOR (если установлено $VISUAL, $EDITOR должен действовать как запасной вариант).

...