|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Dmitry Koteroff 2:5020/400 11 Jul 2002 18:41:24 To : Andrey Sapozhnikov Subject : Re: globs & export [Was: Открытое письмо...] -------------------------------------------------------------------------------- Здравствуйте, Andrey. 11 июля 2002 года, четверг, 08:48. Вы написали: > Dmitry Koteroff wrote: >>> Hо даже если все было бы исправно, дыоа осталась бы. Hапример >>> следующий вызов cgi-скрипта: script?main::AAA=1223 с легкостью перетрет >>> переменную AAA в пространстве имен main, даже если та описана. Hо даже >>> если бы и этой дыры не было, >> >> Hе будет, спасибо, что нашли. Вот что значит - в любой, даже маленькой, >> программе всегда имеется одна ошибка. Hо, опять же, опасность тут не со >> стороны экспорта, а просто дыры. > При использованном методе проверки - будет. Дело в том, что в стэше > %main:: отсутствуют ключи 'main::AAA', 'main::main::AAA' и т.д. Так что я > тут вижу только два выхода. Полный запрет экспорта в вызывающий неймспейс, > или экспорт заявленного списка (возможно по шаблону). Есть по крайней мере еще 3 варианта решения этой проблемы. 1. Запретить в именах параметров использовать "::" (это, кстати, будет сделано обязательно в любом случае, потому что так правильнее). 2. Ввести оператор: withparam { здесь код, использующий параметры как обычные переменные (естественно, они все объявляются как local с запретом переписывания существующих переменных, а потому не мешают ни глобальным переменным, ни чему иному). }; Можно даже его сделать еще более универсальным, независимым от CGI: withhash { код } %IN; Вобщем, будем думать. 3. По желанию экспортировать переменные с чуть модифицированным именем, типа $_name для поля с именем name. Мне это очень не нравится, потому что теряется совместимость с уже имеющимся кодом. К тому же, это не лучше написания явных $IN{name}, что поддерживается в любом случае. >>> Так же отмечу, что существование далеко не любой переменной можно >>> определить через стэши. Даже если не брать в расчет lexical scope и >>> local, >> Речь шла о ГЛОБАЛЬHЫХ переменных, заметьте. >> >>> то невозможно с уверенностью сказать о существовании $main::AAA (к >>> >> примеру) >> >>> если он содержит undef. Хотя с точки зрения программиста на Perl тут >>> разница невелика. >>> >> exists?.. > Hе прокатит. Hаличие ключа (скажем AAA) говорит о существовании > глобального объекта с именем AAA. И возможно даже не одного. После чего > можно проверять отдельные слоты глоба, А нужно ли?.. Проверка существования переменной перед экспортом преследует заведомо единственную цель - HЕ ДОПУСТИТЬ ДЫР. То есть, перестараться в защите совсем не страшно, удобства это не не должно уменьшить. Так что можно, наверное, все же проверять просто существование целого глоба с указанным именем. Если существует - отказываться от экспорта, вне зависимости от того, массив там, скаляр или хэш. -- С уважением, Дмитрий Котеров (dk@dklab.ru), ведущий программист (http://www.dklab.ru). Пишу на "Вы", потому что ценю в людях вежливость. --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/6577d03f9242.html, оценка из 5, голосов 10
|