Эта тема на forum.dklab.ru


maneger: безопасность при использовании глоб. переменных
Вопрос такой:

Как влияет использование глобальных переменных в скрипте на безопасность?

Если используються глобальные переменные это обязательно значит что низкая безопасность?

На сколько выгодно использовать глобальные перменные и на сколько невыгодно заменять их чемто другим?
Алексей С.:
глобальный переменные в смысле в массиве $GLOBALS?
Юрий Насретдинов:
Если используються глобальные переменные это обязательно значит что низкая безопасность?
Нет, но это в принципе немного её снижает. Лучше использовать registeR_globals off, всё-таки
Алексей Пешков:
Использование глобальных переменных - плохой стиль, что говорит о сравнительно невысокой квалификации программиста. Можно сделать предположение, что о безопасности мало задумывались...
Maus:
Использование глобальных переменных - плохой стиль
а если это наиболее простой путь? Скажем, генерация для страницы ключевых слов и заголовка: отдельные фрагменты страницы по-разному заполняют эти поля. Можно, конечно, замутить какую-нибудь функцию с внутренней static-переменной, но, имхо, ненужный изврат.
(register_globals off , разумеется!)
Алексей Пешков:
Если функция генерации метатегов САМА вызывает необходимые ей фрагменты, то не нужны ни глобальные, ни прочие промежуточные переменные.
Maus:
САМА вызывает необходимые ей фрагменты
никак не получается без лишних запросов к БД.
Ksnk:
Использование глобальных переменных - плохой стиль, ...
Стоит, вероятно, уточнить, что-же имелось ввиду. Использование register_globals on или просто переменных, видимых всему скрипту и всем процедурам. Для примера - совсем не использовать глобальные переменные никак не получится :) Массивы $_GET и $_PUT как ни крути - глобальны...
Опять-же стиль программирования, imho, не существует сам по себе. Он является "способом удовлетворения" каких-либо надобностей, как правило - читабельность кода и его модифицируемость. Если какой-то прием программирования затрудняет ту или иную надобность - есть повод объявить его "нестильным" :) Размахивая неаргументированно словом "стиль" и ссылаясь при этом только на рекомендации с советом "не использовать..." можно уподобиться религиозному фанатику ;)
Алексей Пешков:
Под "стилем" я подразумеваю строгое следование структурному и объектному подходу.
Не буду рассказывать про пространства имен, про инкапсуляцию данных, про register_globals...

1) Самый явный недостаток передачи данных через глобальные переменные -- недокументированная в коде взаимозависимость порядка выполнения несвязанных между собой частей системы.

2) Разделение между разными модулями инициализации, модификации и использования одних и тех же данных опасно по простой причине: ошибка в одном маленьком модуле может привести за собой непредсказуемый каскад сбоев в самых разных частях программы. Это называется нарушение безопасности системы.

Кстати, в языке PHP нет оператора "goto", о котором в прошлом веке тоже велись "религиозные войны"...
Ksnk:
Я не очень понимаю какое отношение имеет все это к первому посту темы :).
Алексей Пешков
Приведенные вами высказвания, в общем случае, справедливы, но все равно, не хватает конкретики. Можно, к примеру, порешать задачу, описанную Maus:
Есть страничка, набранная из несколько "случайных" статей. Необходимо сформировать для нее разумный список индексов. Насколько я понял, предлагается отрабатывать статьи независимо друг от друга, вываливая встретившиеся индексы в глобальный массив и по отработке всех статей - вывалить эти индексы в нужное место. (Надеюсь я не сильно много придумал "от себя").
Как такое решение "снижает безопасность системы"?
Какое решение, учитывая "объектный подход", можете предложить вы?
Maus: в каждой шутке есть доля шутки
Кстати, да!
В GLOBALS лежит переменная, являющаяся объектом.
Это правильный подход или нет ? (:
Дмитрий Котеров:
Часто это даже единственный подход.
(Вариант создания статической функции, возвращающей ссылку, я отбрасываю потому что это, по сути, то же самое, а многословность кода увеличивается.)
Алексей Пешков:
http://c2.com/cgi/wiki?GlobalVariablesAreBad
Ksnk:
А вот и цитата оттуда ... If something really should be a global, make it a global...
Статья содержит пример перехода от "глобальности" к "ее отсутствию", так что "объектный" алгоритм решения задачи Maus'а мне примерно понятен, однако остается непонятной отношение этих решений к "безопасности".
imho #1 - тема несколько отходит от "безопасности", которая интересовала автора топика :)
imho #2 - Единственное "разумное" возражение против использования глобальных переменных в статье (своими словами) - в этих переменных легко запутаться. С таким положением очень сложно не согласиться :), особенно если переменных действительно ТАК много, чтобы в них путаться... Лучше быть богатым и здоровым, чем бедным и больным. Все остальные возражения - скорее причуды реализации PHP...
imho #3 - отсутствие оператора GOTO означает позицию авторов PHP в той "религиозной войне", а также означает навязывание своей позиции пользователям языка. Была пара случаев, когда goto позволил бы мне написать на пару строк меньше и несколько понятнее. ):
imho #4 - наличие чувства меры - обязательное условие хорошего стиля программирования :)) Можно ведь и классов наплодить столько, что путаться придется уже в их описаниях...
Алексей Пешков:
В языке Java нет глобальных переменных и функций. Этому есть причины, более веские, чем "чувство меры".
wolandino:
хм, http://www.phpguru.org/article.php?ne_id=72
Maus:
wolandino
Но там все же сказано, что использовать это (подмену $_SERVER['SERVER_NAME']) для эксплойта практически нереально
wolandino:
Maus
практически!=абсолютно

Эта тема на forum.dklab.ru