PHP register_globals=off

uncle17

Наконец-то хочу перейти к такому.
Как переменные из гета-поста вытаскиваются? Не помню...

vlfdimir58

$_GET['']

bobby

$HTTP_GET_VARS (или $_GET)
$HTTP_POST_VARS (или $_POST)

uncle17

э-э-э... а дальше? Совсем туплю...
есть, к примеру, ?a=1&b=qwerty&c=333.
Как сразу всё обозвать, чтобы не писать каждый раз


$a=$_GET["a"];
$b=$_GET["b"];
$c=$_GET["c"];

bobby

extract -- Import variables into the current symbol table from an array
т.е. пишешь
extract($_GET);
extract($_POST);

vlfdimir58

надо extract сделать
ща найду как

vlfdimir58

а, во выше написали

uncle17

разобрался. тхкс.

stalker33rus10

Еще раз, это все было, используй лучше $_REQUEST (по поиску погляди)

Fragaria

вопрос - а нах?

uncle17

А потому уже года два как разработчики РНР не рекомендуют использовать register_globals=on и всё больше хостеров данную опцию оставляют как есть. В т.ч. и мой хостер тоже скоро так сделает - звонил Дениска, предупреждал

Ivan826

Есть одна подстава: на некоторых хостах бывает (я так и не понял что это за директива) что $_GET и $_POST не работаю, поэтому лучше сразу писать $HTTP_GET_VAES и $HTTP_POST_VARS

sergei1969

HTTP POST variables: $_POST
Note:
Introduced in 4.1.0. In earlier versions, use $HTTP_POST_VARS.
так что это не директива, а версия PHP

sinet

А директивой можно как раз $HTTP_GET_VARS и $HTTP_POST_VARS отключить.

sergey_m

extract -- Import variables into the current symbol table from an array
т.е. пишешь
extract($_GET);
extract($_POST);
Таким образом сводя безопасность скрипта на тот же уровень, что был при regidter_globals=on. Это способ для тех, кто пишет в стиле register_globals=on, а хостится на хостинге где он отключен.

bobby

полностью согласен, кстати
я так не делаю

uncle17

так а что же - в каждом скрипте ручками вытаскивать все переменные из массива? Хм... это ж геморрой.

laki

Хотя это и гемморой, но это правильно:
Можно например так :


function ini($varname, $defvalue = '') {
global $_POST, $_GET;
if(isset($_POST[$varname] {
$$varname = $_POST[$varname];
return;
}
if(isset($_GET[$varname] {
$$varname = $_GET[$varname];
return;
}
$$varname = $defvalue;
}

uncle17

Пасиба.
Следующий вопрос. Конфигурация Duron1400/256/XP/Apache 1.3.28/PHP 4.3.4 as a module.
Есть обычный скрипт ресайзинга картинок:


<?
extract($_GET);
$r=imagecreatefromjpeg($img_id.".jpg");
if ($rs_type==1)
{
if (imagesx($r)>=imagesy($r {$new_w=$maxsize; $new_h=$maxsize*(imagesy($r)/imagesx($r;}
else {$new_h=$maxsize; $new_w=$maxsize*(imagesx($r)/imagesy($r;}
}
elseif ($rs_type==2)
{
$new_w=$maxsize; $new_h=$maxsize*(imagesy($r)/imagesx($r;
}
elseif ($rs_type==3)
{
$new_h=$maxsize; $new_w=$maxsize*(imagesx($r)/imagesy($r;
}
$dst_img=ImageCreateTrueColor($new_w,$new_h);
ImageCopyResized($dst_img,$r,0,0,0,0,$new_w,$new_h,ImageSX($rImageSY($r;
imagepng($dst_img);
?>


Рендеринг в ИЕ странички с десятком картинок такого вида занимает, на глаз, около 2 секунд. Это нормально? А что же тогда будет, если на такой сервак одновременно зайдут человек 100?

laki

Блин не удачно написал, напиши с оберткой, а то обертку влом писать. тогда посмотрю что у меня, а еще вставь лучше микротайм, чтобы точно знать, что тормозит.
define ('_PHPSITELIB_GENTIME', 1);
if (_PHPSITELIB_GENTIME) $_phpsitelib_gen = get_micro_time;
<your code>
if (_PHPSITELIB_GENTIME) {
print "<p>Generated " . (get_micro_time - $_phpsitelib_gen) . " sec.</p>";
}

uncle17


Fatal error: Call to undefined function: get_micro_time in c:\program files\apache group\apache\htdocs\photo\index.php on line 2
З.Ы. Обертка - это кто?

laki

RE> З.Ы. Обертка - это кто?
Ну откуда этот скрипт вызывается
RE> Fatal error: Call to undefined function: get_micro_time in c:\program files\apache group\apache\htdocs\photo\index.php on line 2
Странно у меня работает. Версия php м.б. другая

uncle17

или не включен какой-то модуль...

laki

Сори: у меня там своя библиотека подключается.
вот:
function get_micro_time {
list($usec, $sec) = explode(' ', microtime;
return float)$usec + (float)$sec);
}

uncle17

0.00353693962097 sec.
Хм... или это ИЕ тормозит, или я чего-то не понимаю...

laki

это очень хорошее время обычно требование 0.005-0.01 и то последнее уже плохо, в опере протесть

uncle17

так же... В общем, и там, и там - от 0.002 до 0.011, при этом память загружена конкретно и окон полно висит.

bansek

Имхо более прикольная версия (мой вариант

/**
* Вспомогательная ф-я. Ищет в запросе первый аргумент.
* Если находит - кладет его в глобальные переменные (в случае уст. флага $set_glob)
* со значением из запроса, если нет - со значением, которое передано в ф-ию
* @author Rumata
* @param string $var_name имя переменной
* @param string $def_val дефолтовое значение
* @param string $type Тип переменной. Если mixed, то приведение не производится
* @param bool $set_glob Флаг, показывающий, надо ли устанавливать значение глобальной переменной
* @return mixed Переменная, которая была установлена
*/
function pretest($var_name, $def_val, $type, $set_glob = false) {
if (isset($_REQUEST[$var_name] {
$tmp = $_REQUEST[$var_name];
} else {
$tmp = $def_val;
}
if ($type != "mixed" && $type != "")
settype($tmp, $type);
if ($set_glob) $GLOBALS[$var_name] = $tmp;
return $tmp;
}

stm7884696

нормально все будет, если и 200 человек зайдут....
помню у меня как то 30000 картинок перерисовались за 35 секунд.... так что в принципе нормально....
ЗЫ А сайт с 45000 HTML страниц создаеться за 3 минуты

sergey_m



function ini($varname, $defvalue = '') {
global $_POST, $_GET;
if(isset($_POST[$varname] {
$$varname = $_POST[$varname];
return;
}
if(isset($_GET[$varname] {
$$varname = $_GET[$varname];
return;
}
$$varname = $defvalue;
}


Я вообще PHP не знаю, но у меня есть ощущение, что эта фигня делает всё тот же extract, а следовательно даёт тот же эффект, что register_globals.

sergey_m

так а что же - в каждом скрипте ручками вытаскивать все переменные из массива? Хм... это ж геморрой.
Чууувааак! Праграммировать граматна эта вааще конкретный геморрой! Радуйся что ты выбрал один из наиболее безгеморройных (читай безграмотных) языков.

sergei1969

Я вообще PHP не знаю, но у меня есть ощущение, что эта фигня делает всё тот же extract, а следовательно даёт тот же эффект, что register_globals.

напомнило:
совковые времена, съезд или ещё какое заседание.... :
Я книгу .... (фамилия неугодного власти писателя) конечно же не читал, но считаю что .... (обсирание)

Короче, эта функция делает как раз не то же самое, что register_globals=On, а как раз помогает в работе, если register_globals=Off

bansek

Не, ну не скажи. Эта ф-ия, на самом деле, хуже, чем extract т.к. вытаскивает переменные не в том порядке - по умолчанию берутся сначала из GET, потом POST. А вообще так лучше, чем extract, т.к. ты лично отвечаешь за каждую вынутую переменную, а не вынимаешь их всех скопом. В этом отношении моя функция еще более продвинута, т.к. задает строгую типизацию.

sergey_m

Да, я ошибся.

sergey_m

Типизацию она не задаёт конечно, но главное что в глобальные переменные экспортируются только те, что ты скажешь, а не все.
Но мне всё равно это не нравится, потому что эти переменные полученные извне (т.н. tainted) ничем не отличаются от твоих собственных переменных. Удобно, когда ты сразу видишь $cgi->param('var' а не $var. Я когда пишу веб-скрипты, то никогда не делаю: $var = $cgi->param('var' что бы затем юзать $var. Я всегда пишу длинный вариант, что бы было наглядно видно, что используются tainted данные.
Оставить комментарий
Имя или ник:
Комментарий: