Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как сделать переменную глобальной
 
 автор: Eugene77   (21.05.2007 в 13:46)   письмо автору
 
 

Простая вроде ситуация:
Переменная нужна в разных местах. Внутри функций и вне их.
Я надеялся, что она станет глобальной, если я присвою ей значение в самом начале файла, а потом модифицирую его уже на правильное вызовом функции, но нет, внутри функции она становится пустой строкой. Будто я ей ничего не присваивал.
Что делать?

   
 
 автор: Trianon   (21.05.2007 в 13:55)   письмо автору
 
   для: Eugene77   (21.05.2007 в 13:46)
 

Нельзя сделать переменную глобальной насильно.
Если какая-то из функций хочет работать с переменной $var, определенной на верхнем уровне, она должна содержать свое собственное описание global $var;

   
 
 автор: mefestofel   (21.05.2007 в 16:33)   письмо автору
 
   для: Trianon   (21.05.2007 в 13:55)
 

> Нельзя сделать переменную глобальной насильно.
:-)

   
 
 автор: ШИМ   (21.05.2007 в 13:58)   письмо автору
 
   для: Eugene77   (21.05.2007 в 13:46)
 

Воспользуйся СЕССИЯМИ!
присвой переменной например

$_SESSION['var'] = ' ЗНАЧЕНИЕ';

и у тебя эта переменная будет доступна везде

   
 
 автор: Eugene77   (21.05.2007 в 14:15)   письмо автору
 
   для: ШИМ   (21.05.2007 в 13:58)
 

То есть из других скриптов она тоже будет доступна?

   
 
 автор: Trianon   (21.05.2007 в 15:03)   письмо автору
 
   для: ШИМ   (21.05.2007 в 13:58)
 

чем это лучше $GLOBALS?

   
 
 автор: exp   (21.05.2007 в 15:21)   письмо автору
 
   для: Trianon   (21.05.2007 в 15:03)
 

Можно ещё написать в .htaccess строку
SetEnv MY_VAR /home/user/public_html/inc 
и потом везде в $_SERVER['MY_VAR'] будет это /home/....

   
 
 автор: Eugene77   (21.05.2007 в 20:48)   письмо автору
 
   для: exp   (21.05.2007 в 15:21)
 

Это переменная только для чтения?
Можно подробнее?!
Может быть ссылочка есть под рукой?

   
 
 автор: Trianon   (21.05.2007 в 15:57)   письмо автору
 
   для: ШИМ   (21.05.2007 в 13:58)
 

ничего подобного не произойдет.
Сравните

<?php 
  $var 
' ЗНАЧЕНИЕ'
  function 
fun()
  {
     global 
$var;
     if(isset(
$var))
         echo 
"Переменная \$var=$var";
    else 
        echo 
"Переменная \$var неопределена";
  }
  
fun();
?>

и

<?php 
  $_SESSION
['var'] = ' ЗНАЧЕНИЕ'
  function 
fun()
  {
     if(isset(
$var))
         echo 
"Переменная \$var=$var";
    else 
        echo 
"Переменная \$var неопределена";
  }
  
fun();
?>

   
 
 автор: bronenos   (21.05.2007 в 16:13)   письмо автору
 
   для: Trianon   (21.05.2007 в 15:57)
 

вы в примерах не ту переменную определяете
перепутали с функцией =)

   
 
 автор: Trianon   (21.05.2007 в 16:43)   письмо автору
 
   для: bronenos   (21.05.2007 в 16:13)
 

проверял не ту. Спасибо - поправил.

   
 
 автор: Nemesis   (21.05.2007 в 16:34)   письмо автору
 
   для: Trianon   (21.05.2007 в 15:57)
 

Где то читал,что не безопасно использовать global, так ли это на самом деле ?

   
 
 автор: mefestofel   (21.05.2007 в 16:35)   письмо автору
 
   для: Nemesis   (21.05.2007 в 16:34)
 

Да, это на самом деле так и есть...
:-)

   
 
 автор: Trianon   (21.05.2007 в 16:47)   письмо автору
 
   для: Nemesis   (21.05.2007 в 16:34)
 

субъективно.

объективно - использовать register globals
a) очень неудобно, как раз всилу того, что безопасный скрипт при этом написать существенно сложнее
б) крайне недальновидно, поскольку этот механизм пытаются из языка изжить. В 6 версии обещали выкинуть вообще.


Впрочем, вывод не меняется.

   
 
 автор: Eugene77   (21.05.2007 в 20:42)   письмо автору
 
   для: Trianon   (21.05.2007 в 15:57)
 

Я почему-то понял, что имеется в виду не

<?php  
  $_SESSION
['var'] = ' ЗНАЧЕНИЕ';  
  function 
fun() 
  { 
     if(isset(
$var)) 
         echo 
"Переменная \$var=$var"
    else  
        echo 
"Переменная \$var неопределена"
  } 
  
fun(); 
?>


а


<?php  
  $_SESSION
['var'] = ' ЗНАЧЕНИЕ';  
  function 
fun() 
  { 
     if(isset(
$_SESSION['var'])) 
         echo 
"Переменная \$_SESSION['var']=$_SESSION['var']"
    else  
        echo 
"Переменная \$_SESSION['var'] неопределена"
  } 
  
fun(); 
?>


Давайте автора спросим!
Мне только кажется, что это будет медленная переменная. Правильно я понимаю?
Ну и вопрос безопасности тоже актуален, в конечном итоге я отдаю эту переменную функции unlinc().
Может какая-то проверка нужна специальная?

   
 
 автор: Trianon   (21.05.2007 в 21:19)   письмо автору
 
   для: Eugene77   (21.05.2007 в 20:42)
 

А второй код не создает дополнительных переменных.
Он создает элемены в уже существующем суперглобальном массиве.
И он ничем не лучше $GLOBALS['var']

   
 
 автор: Eugene77   (21.05.2007 в 21:53)   письмо автору
 
   для: Trianon   (21.05.2007 в 21:19)
 

Я встречал такое мнение, что суперглобальные массивы всё же лучше глобальных, кажется безопрасней, не создают столь очевидных дырок.
Поскольку PHP для меня пока сфера новая, продумывать скрипты на предмет их потенциальной неустойчивости к взлому, невозможно - не накопилось необходимого исходного объёма информации в голове. Поэтому я пока завишу от прямых так называемых "советов бывалых", что не является, разумеется, нормальным решением, но пока так как есть.
Мне бы получить ответ на такой вопрос в данной ситуации:
Какие переменные использовать, чтобы максимально обеспечить безопасность, при том, что продуманной политики безопасности пока не предвидится?
То есть расположить бы в рядочек все переменные начиная с $GLOBALS по мере роста их конфиденциальности.

   
 
 автор: mefestofel   (22.05.2007 в 02:03)   письмо автору
 
   для: Eugene77   (21.05.2007 в 21:53)
 

Массив $_GLOBALS является не защищенным из-за наличия уязвимости. Удаленный пользователь может переопределить глобальные переменные с помощью multipart/form-data POST запроса со специально сформированным полем file upload или посредством сценария, вызывающего функцию extract() или import_request_variables(). Также для эксплуатации уязвимости требуются определенные условия.

   
 
 автор: Trianon   (22.05.2007 в 09:25)   письмо автору
 
   для: mefestofel   (22.05.2007 в 02:03)
 

Хотелось бы поглядеть пример.

   
 
 автор: mefestofel   (22.05.2007 в 10:58)   письмо автору
 
   для: Trianon   (22.05.2007 в 09:25)
 

Думаю модератор не обрадуется...
Как то уже поднимались вопросы 'этики' ...

   
 
 автор: Trianon   (22.05.2007 в 11:01)   письмо автору
 
   для: mefestofel   (22.05.2007 в 10:58)
 

При чем тут этика?
Если это уязвимость php - о ней имеет смысл сообщить в phpteam. Дырку законопатят.
Если это заблуждение - от него стоит избавиться.

PS. модератор моего п/я несколько более толлерантен.

   
 
 автор: mefestofel   (22.05.2007 в 11:04)   письмо автору
 
   для: Trianon   (22.05.2007 в 11:01)
 

К сожалению это не заблуждение, думаю не очень красиво выкладывать exploit'ы на таком форуме как softtimt.ru...
Представляете что будет если все подряд начнут применять эксплоиты, форум ведь индексируется в Яндексе...

   
 
 автор: cheops   (22.05.2007 в 11:13)   письмо автору
 
   для: mefestofel   (22.05.2007 в 11:04)
 

Эксплоит - это готовый код для взлома конктертного приложения - как отмычка - им здесь действительно не место... но демонстрация уязвимости только приветствуется - это позволит форумчанам лучше защитить свой код. Например, в разделе "Задачи" обсуждаются и SQL-инъекции и подбор пароля - цель их просто продемонстрировать уязвимости, которые очень просто допустить при невнимательном кодировании.

   
 
 автор: mefestofel   (22.05.2007 в 11:17)   письмо автору
 
   для: cheops   (22.05.2007 в 11:13)
 

То есть Вы не против если я буду описывать уязвимости в разделе 'Задачи'? Хочу еще раз услышать ответ, может не понял что-то..... :-)

   
 
 автор: cheops   (22.05.2007 в 13:01)   письмо автору
 
   для: mefestofel   (22.05.2007 в 11:17)
 

В задачах обсуждались задачи - там механизм автоматического размещения - туда лучше не постить темы без надобности. Уязвимости можно обсуждать в соответствующих разделах форума. Как бы никто вам это запретить не может :) форум для того и существует, чтобы вы могли придти сюда и обсудить все интерсующие вас вопросы и получить быстрый отклик от сообщества.

   
 
 автор: Trianon   (22.05.2007 в 11:31)   письмо автору
 
   для: mefestofel   (22.05.2007 в 11:04)
 

да не просил я эксплоит. Ну как минимум - готовый к употреблению.
Просил пример, иллюстрирующий принцип. Откровенно скажу, потому что не верил.
PHP - настолько динамично развивающийся проект, что поверить в существование эксплойта, работоспособность которого обусловнена ошибками в движке, а не в php-коде, так сразу -трудно. Считайте это костностью мышления.

   
 
 автор: Eugene77   (23.05.2007 в 13:38)   письмо автору
 
   для: mefestofel   (22.05.2007 в 11:04)
 

Ну вы насмешили своей этикой!
Что, если дырка у кого-то в штанах на заметном месте, то вы скромно молчать будете?
Друзья так не поступают!

   
 
 автор: mefestofel   (23.05.2007 в 14:11)   письмо автору
 
   для: Eugene77   (23.05.2007 в 13:38)
 

Ну да а потом все побегут ломать и Ваши проекты тоже....
Между прочим о ней давно уже знают, и ее даже залатали...
Но периодичнски можно встретить php без заплатки...
Очень часто к сожалению....

   
 
 автор: Trianon   (23.05.2007 в 14:38)   письмо автору
 
   для: mefestofel   (23.05.2007 в 14:11)
 

>Ну да а потом все побегут ломать и Ваши проекты тоже....
>Между прочим о ней давно уже знают, и ее даже залатали...

в какой версии?

Это?


http://www.linux.org.ru/view-message.jsp?msgid=162779&back=view-group.jsp%3Fgroup%3D213&anonymous=hide

Это старая дырка.

[поправлено модератором]

   
 
 автор: mefestofel   (23.05.2007 в 14:57)   письмо автору
 
   для: Trianon   (23.05.2007 в 14:38)
 

Ну да, почти.....
:-):-):-):-)
Думаю тема закрыта...
P.S. Trianon вспомните про костность мышления, не все так просто...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования