Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 globs & export [Was: Открытое письмо...]   Andrey Sapozhnikov   11 Jul 2002 12:48:18 
 Re: globs & export [Was: Открытое письмо...]   Dmitry Koteroff   11 Jul 2002 18:41:24 
Архивное /ru.cgi.perl/6577d03f9242.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional