Т.е. вместо
$var1 = $_POST['var1'];
$var2 = $_POST['var2'];
$var3 = $_POST['var3'];
echo $var1;
echo $var2;
echo $var3;
писать так
extract($_POST);
echo $var1;
echo $var2;
echo $var3;
Спустя 1 минута, 57 секунд (14.02.2011 - 13:10) linker написал(а):
Не вижу ничего опасного. Главное проверить/отфильтровать значения этих переменных.
Спустя 12 минут, 5 секунд (14.02.2011 - 13:22) IPnex написал(а):
Цитата (linker @ 14.02.2011 - 13:10) |
Не вижу ничего опасного. Главное проверить/отфильтровать значения этих переменных. |
Просто вычитал на каком-то форуме, что extract это тот же самый register globals и следовательно ему свойственны все дыры, которые используют при register globals on
Спустя 12 минут, 16 секунд (14.02.2011 - 13:34) linker написал(а):
Отчасти они правы кстати, но этого можно избежать если взять за правило, прежде чем использовать переменную, ее нужно инициализировать. Тогда проблем не будет.
Спустя 1 час, 31 минута, 51 секунда (14.02.2011 - 15:06) Белый Тигр написал(а):
Лучше вообще так не поступать. extract() не является аналогом register_globals. Она ещё хуже.
При вызове extract() могут быть переназначены и ранее объявленные переменные, чего с register_globals делать нельзя. Если вам нужны какие-то ячейки _POST, то пишите обращение к каждой из них вручную (в случае с присваиванием отдельным переменным).
При вызове extract() могут быть переназначены и ранее объявленные переменные, чего с register_globals делать нельзя. Если вам нужны какие-то ячейки _POST, то пишите обращение к каждой из них вручную (в случае с присваиванием отдельным переменным).
Спустя 2 минуты, 59 секунд (14.02.2011 - 15:09) linker написал(а):
Белый Тигр
Обычно, обработка $_POST, $_GET идет в начале скрипта, а потому, что-то переопределить не получился. Правило инициализации переменных нейтрализует все негативные эффекты.
Обычно, обработка $_POST, $_GET идет в начале скрипта, а потому, что-то переопределить не получился. Правило инициализации переменных нейтрализует все негативные эффекты.
Спустя 3 часа, 55 минут, 35 секунд (14.02.2011 - 19:05) Белый Тигр написал(а):
Если вы примите POST-массив с данными
a => 1
b => 2
c => 3
и выполните extract($_POST), то сколько бы раз вы не объявили до этого вызова переменные $a, $b, $c - они всё равно переобъявятся. Это при register_globals их переобъявить будет нельзя.
a => 1
b => 2
c => 3
и выполните extract($_POST), то сколько бы раз вы не объявили до этого вызова переменные $a, $b, $c - они всё равно переобъявятся. Это при register_globals их переобъявить будет нельзя.
Спустя 14 часов, 20 минут, 26 секунд (15.02.2011 - 09:25) linker написал(а):
a => '1 OR 1=1'
b => 2
c => 3
extract($_POST);то ничего страшного не будет.
...
// Много кода
...
$a = 0; // Инициализируем переменную
mysql_query("SELECT * FROM `table` WHERE `col` = " . $a);
Спустя 5 часов, 13 минут, 26 секунд (15.02.2011 - 14:39) Белый Тигр написал(а):
Данный пример не отменяет того, что некоторые переменные инициализируются в начале работы скрипта.
ТС: не стоит заморачиваться как лучше использовать extract(). Просто не используйте её и всё.
ТС: не стоит заморачиваться как лучше использовать extract(). Просто не используйте её и всё.
Спустя 7 минут, 51 секунда (15.02.2011 - 14:47) jetistyum написал(а):
из мануала по PHP
Цитата |
Do not use extract() on untrusted data, like user input (i.e. $_GET, $_FILES, etc.). If you do, for example if you want to run old code that relies on register_globals temporarily, make sure you use one of the non-overwriting extract_type values such as EXTR_SKIP and be aware that you should extract in the same order that's defined in variables_order within the php.ini. |
Спустя 2 дня, 20 часов, 22 минуты, 25 секунд (18.02.2011 - 11:09) IPnex написал(а):
Ок, спасибо за ответы, все учту
Спустя 54 минуты, 28 секунд (18.02.2011 - 12:03) vagrand написал(а):
Извинит за слишком эмоциональный ответ, но за использование extract() надо отрывать руки. Сейчас приходится работать с довольно сложным кодом, где использовался extract() - совершенно не понятно откуда приходят переменные, то ли они где-то определены, то ли пришли из реквеста.
Спустя 8 месяцев, 1 день, 5 часов, 16 минут, 21 секунда (19.10.2011 - 16:20) denisOg написал(а):
Цитата (Белый Тигр @ 14.02.2011 - 16:05) |
Если вы примите POST-массив с данными a => 1 b => 2 c => 3 и выполните extract($_POST), то сколько бы раз вы не объявили до этого вызова переменные $a, $b, $c - они всё равно переобъявятся. Это при register_globals их переобъявить будет нельзя. |
У extract ( ) есть настройки. Она может не переписывать, а создавать новые переменные с префиксом extract ($array,EXTR_PREFIX_SAME,"prefix_")
Спустя 3 минуты, 30 секунд (19.10.2011 - 16:23) Winston написал(а):
denisOg
И зачем было поднимать, столетнею тему ?
И зачем было поднимать, столетнею тему ?
Спустя 20 минут, 19 секунд (19.10.2011 - 16:44) denisOg написал(а):
Цитата (Winston @ 19.10.2011 - 13:23) |
denisOg И зачем было поднимать, столетнею тему ? |
Простоу меня сейчас эта ситуация актуальна.
Я хочу уйти от использования register_globals=ON на своем движке.
Вот и интерисуюсь как это можно сделать более быстро и гибко.
Как вариант: extract() но боюсь за эту функцию.
Или руками инициализировать все входящие переменные.
Может вы подскажите?
Спустя 3 месяца, 17 дней, 23 часа, 11 минут, 39 секунд (7.02.2012 - 15:55) ZeiN.ua написал(а):
А чем foreach и $$ не устраивает? Можно тут же в цикле и отфильтровать.