PHP Globals - нужен совет

12
YDoron
На сайте с 25.10.2005
Offline
182
1408

Помогите пожалуйста определится.

Не могу понять, можно ли допускать глобальные переменные в php, или всё-же это опасно.

Может быть, это безопасно лишь для определённых задач? В каких случаях глобальные переменные могут быть потенциально опасными?

И почему по-умолчанию, они всё-таки отключены?

настраиваю Linux сервера, правлю баги, пишу фичи под Wordpress и Laravel
edogs software
На сайте с 15.12.2005
Offline
775
#1
Nervjaga:
1) Не могу понять, можно ли допускать глобальные переменные в php, или всё-же это опасно.
2) Может быть, это безопасно лишь для определённых задач?
3) В каких случаях глобальные переменные могут быть потенциально опасными?
4) И почему по-умолчанию, они всё-таки отключены?

1) Никакой опасности глобальные переменные сами по себе не несут.

2) Нет, это безопасно для любых задач. Зачастую это даже удобнее.

3) Если у программиста писавшего скрипт кривые руки.

4) Потому что по умолчанию у многих "программистов" кривые руки.

Что бы не давать повода к холи-вару, отметим что есть 3 способа писать

1) Для register globals on только

2) Для register globals off только

3) Для любого состояния register globals

Нормальный человек пишет под 3-ую ситуацию.

Правильно написанный скрипт для 1-ой ситуации парой строк превращается в скрипт способный правильно работать во 2-ой ситуации.

Правильно написанный скрипт для 2-ой ситуации потенциально опасен в ситуации, когда register globals становится on и/или когда он при дальнейшей разработки скрипт становится частью бОльшего.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
sun
На сайте с 22.10.2005
Offline
81
sun
#2
Nervjaga:
Может быть, это безопасно лишь для определённых задач? В каких случаях глобальные переменные могут быть потенциально опасными?

Лучше пишите без них, т.е. отключите. Они опасны тем что через переменные можно взломать ваш скрипт путем подставления переменных в урл или форму, а так как при включенных глобальных переменных PHP обрабатывает такие переменные как обычные можно поменять значение любой переменной и она обработается скриптом даже на удаленном хотинге, чего вам явно не надо.

devmen.com (http://devmen.com/)
dkameleon
На сайте с 09.12.2005
Offline
386
#3

3. Если программист не проводит предварительную инициализацию переменных, требующих того.

Кроме того, лучше писать код не используя глоальные переменные.

В таком случае он будет работать на обоих хонфигурациях (он/офф).

Дизайн интерьера (http://balabukha.com/)
A
На сайте с 12.04.2007
Offline
9
#4
Nervjaga:
Помогите пожалуйста определится.
Не могу понять, можно ли допускать глобальные переменные в php, или всё-же это опасно.
Может быть, это безопасно лишь для определённых задач? В каких случаях глобальные переменные могут быть потенциально опасными?

И почему по-умолчанию, они всё-таки отключены?

Я бы предпочел работать с register globals off edogs конечно правильно говорит, что всё дело в руках, но интернет такая штука, что лучше избыточно обезопасить себя, чем случайно оставить брешь.

seo.adman.com: покупка/продажа ссылок, рекламный брокер (http://seo.adman.com) vads.adman.com: свой рекламный брокер за 5 минут (http://vads.adman.com)
[Удален]
#5
edogs:
Нормальный человек пишет под 3-ую ситуацию.
Правильно написанный скрипт для 1-ой ситуации парой строк превращается в скрипт способный правильно работать во 2-ой ситуации.
Правильно написанный скрипт для 2-ой ситуации потенциально опасен в ситуации, когда register globals становится on и/или когда он при дальнейшей разработки скрипт становится частью бОльшего.

Правильно написаный скрипт в любой ситуации безопасен, а во 2-ой ситуации тем более, так что лучше/безопаснее писать именно для register globals только off

(а переменные абсолютно всегда надо обнулять, без каких либо исключений)

edogs software
На сайте с 15.12.2005
Offline
775
#6

На хостинге лучше выставить register globals off, пусть юзер включает на свой страх и риск:)

Скрипты надо писать так, что бы они работали корректно и при register globals on.

Никакой опасности включение register globals on в себе не несет. Опасность может в себе нести неправильно написанный код только, некорректность написания которого будет заметна только при on настройках.

И беда в том, что обычно когда идет речь о том, что "писать надо под off только" (вариант 2), это подразумевает что человек берет переменные из суперглобальных массивов и все. Потому что человеку дают ссылки на $_POST, $_GET и т.д., и подразумевают что переменные он сам догадается обнулить, так ведь очень часто как раз не догадается и это будет началом конца.

Зингельшухер:
.... лучше/безопаснее писать именно для register globals только off

Чем это безопаснее кода который будет работать при любом состоянии register globals (вариант 3)?

Каширин
На сайте с 03.01.2004
Offline
1018
#7

Глобальные переменные не несут в себе опасности. Только лишь путаницу в данных у неопытного программиста. Если боитесь - передавайте каждый раз параметры в функцию ;)

[Удален]
#8
edogs:
так ведь очень часто как раз не догадается и это будет началом конца.

Для этого есть "нотисы" и опытный программист всегда включает их во время отладки и выключает в финальном продукте.

И вот опять вернулись к простой истине

Зингельшухер:
Правильно написанный скрипт в любой ситуации безопасен

(естественно если "любая ситуация" не подразумевает изначально опасный скрипт типа "трояна" или "вируса" но это отдельная история)

YDoron
На сайте с 25.10.2005
Offline
182
#9
Каширин:
Если боитесь - передавайте каждый раз параметры в функцию

Для полноты картины, напишите тут кто-нибудь, пожалуйста, мини howto. Спасибушки.

edogs software
На сайте с 15.12.2005
Offline
775
#10
Nervjaga:
>Сообщение от Каширин
>Если боитесь - передавайте каждый раз параметры в функцию
Для полноты картины, напишите тут кто-нибудь, пожалуйста, мини howto. Спасибушки.

Если отвечать конкретно на этот вопрос, то допустим у Вас есть код


$a++;$b=$c+5;echo $a,$b;

Который должен выводить 15

Вы хотите что бы на него не влияли "глобальные" переменные, то можно "завернуть" это в функцию, например


function abazaba() {$a++;$b=$c+5;echo $a,$b;}
abazaba();

А если, допустим, к этому моменту у Вас есть переменная $c - где-то ранее определённая в скрипте, то можно передать её и только её в функцию


function abazaba($c) {$a++;$b=$c+5;echo $a,$b;}
abazaba($c);

Если она ($c) глобальная, то можно


global $c;
function abazaba() {global $c; $a++;$b=$c+5;echo $a,$b;}
abazaba();

Но ничто не мешает и "обнулить" переменные перед использованием, если они д.б. пустыми по идеологии скрипта


unset($a,$c);
$a++;$b=$c+5;echo $a,$b;
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий