ПредишенСледващото

Как мога да се избегне предаването потребителски променливи чрез черупка, когато се обаждате EXEC () и система ()?

В Perl, можете да стартирате външна програма по различни начини. Можете да заснемане на продукцията на външни програми, използващи backticks:

Можете да отворите "тунел" (тръба) за програмата:

отворена (подредени "| / ЮЕсАр / хамбар / сортиране | / ЮЕсАр / хамбар / Uniq");

Можете да стартирате външна програма и да чака края на изпълнението им чрез система ():

система "/ ЮЕсАр / хамбар / сортиране

или можете да стартирате външни програми, без връщане на контрола при използване EXEC ():

EXEC "/ ЮЕсАр / хамбар / сортиране

Всички тези изрази са опасни, ако използвате данните, въведени от потребителя, който може да съдържа мета знаци. За системата () и EXEC () има синтактична функция, която ви позволява да стартирате външна програма директно, без да се прибягва до обвивката на операционната система. Ако се преминава аргументи за външната програма, които не са низ, списък, Perl няма да използва черупки мета-символи, и няма да доведе до нежелани странични ефекти. Например:

Можете да използвате тази функция, за да се отвори в тунела, без да се прибягва до черупка. Повикване на открито в един магически последователност от символи | -, използвате копие на Perl и отвори тунел (тръба) към копието. Дъщерно дружество копие от Perl след това незабавно да изпълни външни програми с помощта на списък с аргументи за открит носител ().

отворена (подредени "| -") || EXEC "/ ЮЕсАр / хамбар / вид", $ uservariable;

докато $ линия (@lines)

печат ПОДРЕДИ $ линия, "\ Н";

За да прочетете от метода на тунел като може да се използва без да се прибягва до корпуса, с последователността - |:

отворена (GREP, "- |") || EXEC "/ ЮЕсАр / хамбар / Впиши", $ userpattern, $ името на файла;

печат "мач: $ _";

Това са форми на открито (), което винаги трябва да се използва в случаите, когато в друга ситуация бихте използвали пренасочени отворен (канализиран отворен).

Още по-сложен функция ви позволява да изпълнява външни програми и да ги заблудят, че да свое име. Това е полезно за програми, чиято дейност зависи от помощта на имена, те се изпълняват.

система $ nastoyaschee_imya "lozhnoe_imya", "arg1", "т.2"

система $ черупка "-sh", "- norc"

Този пример започва ш - обвивка на операционната система - с "-sh" име, принуждавайки я да действа интерактивно. Zamette, че това име програма трябва да се съхранява в променлива, както и че между името на променливата и началото на списъка без аргументи точка.

Можем да напишем тази команда е по-компактен:

Какво е "тест на предаване" (Taint проверки) в Perl? Как мога да ги активирам?

Както видяхме, един от най-често срещаните проблеми на сигурността, когато програмиране CGI - прехвърлянето на черупки променливите на OS потребителски без потвърждение. Perl осигурява механизъм за проверка на "инфекциозността", която не позволява да го направят. Всяка променлива, която е данни proinitsiirovana извън програмата (включително данни от околната среда, на стандартния вход и команден ред) се счита като "заразен" и вече не може да се използва извън програмата. Инфекцията може да се разпространи. Ако използвате замърсена променлива, за да се придаде стойност на друга променлива, втората променлива също е заразен. Заразените променливи не могат да бъдат използвани, за да се позове на EVAL (), система (), EXEC () или свиреха отворени (). Ако се опитате това, Perl спира и показва предупреждение. Perl също отказват да работят, ако се опитате да се обадите на външна програма, която не е изрично определен от стойността на път.

Във версия 4 Perl език включва проверка с помощта на специална версия на интерпретатора се нарича "taintperl":

Във версия 5 - използвайте -Т флаг, когато се стартира интерпретатора:

По-долу е описан като "обеззаразени" (untaint) променливи.

Добре, аз съм включена проверка на заразност, както се препоръчва. Сега ми скрипт завършва със съобщението "Несигурен $ ENV по линия XX" на всеки да започне!

Дори и да не се доверяват променливата от обкръжението, когато работи външни програми, има възможност, която прави външна програма. Поради това, че винаги трябва да включва следния ред в началото на скрипта, ако използвате проверки Taint:

Редактирайте го така, да се изброят в директория, в която искате да търсите. Vklyuyaenii представа за текущата директория ( ".") За променливата PATH е лоша идея.

Както "дезинфекция (untaint) променлива?

Премахна метасимвола от променливата, но Perl все още мисли, че тя е заразен!

Виж по-горе отговор. Единственият начин да се дезинфекцират променлива - използвайте търсенето маска.

Това не е безопасна експлоатация търсене $ Foo =

Често проблемът е Perl CGI скрипт, за да получите на потребителя да списък с ключови думи и да ги използват в операция по търсене, за да намерите най-маска на съвпадение имена на файлове (или нещо - нещо подобно). Това само по себе си не е опасно. Опасен оптимизация, които някои програми на Perl използват, за да се ускори търсенето. Ако използвате променлива в операцията по търсене, изразът е съставен всеки път, когато се извършва операцията. За да се избегне прекомпилирате, заемащи време, можете да използвате специален флаг - о, което ще доведе до факта, че изразът ще бъде съставен само веднъж:

Сега, обаче, Perl ще игнорира всички промени в променливата, което ще доведе до неправилна работа на този вид на цикъла:

foreach $ user_pattern (@user_patterns)

печатате, ако м / $ user_pattern / о;

За да избегнете този проблем, програмисти, писане на Perl, често използват този трик:

foreach $ user_pattern (@user_patterns)

печатате, ако m / \ Q $ user_pattern \ E / о;

Моят CGI скрипт се нуждае от повече права, отколкото става все като потребител никой. Как мога да променя потребителското си име?

Можете да направите скрипт, изпълняван с привилегиите на собственика си чрез създаването на бита те:

Можете да му даде право на групата, към която принадлежи на собственика, подготвяйки и бит в областта на група:

Въпреки това, много Unix системи съдържат вратичка, която позволява такива хакерски скриптове. Това важи само за скриптове, вместо да съставят програми. В такива системи, опит да стартирате скрипта на Perl, за които са били изложени и бита, ще доведе до съобщение за грешка от страна на Perl.

На тези системи, имате две възможности:

Можете да поправите на ядрото да се предотврати инсталирането на тези битове за файловете за скрипт. Perl въпреки това ще определи правилно тези битове и настроите потребителски идентификатор. Повече информация за това може да се намери в Често задавани въпроси Perl:

Можете да поставите скрипта в черупката, napmsannuyu в C. Обикновено това изглежда така:

След съставянето на програмата, vystavte и бита. Програмата ще се извършва със собственика на правата, за да стартирате Perl интерпретатора и изпълнение на скрипта в досието "foo.pl" на.

В допълнение, можете да стартирате самия сървър на потребителя достатъчно привилегии за извършване на необходимите действия. Ако използвате на CERN сървъра, имате възможност да се изпълнява на сървъра, с различни права за различните сценарии. Вижте. Документацията CERN за допълнителна информация.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!