Сегодня 6 мая, понедельник ГлавнаяНовостиО проектеЛичный кабинетПомощьКонтакты Сделать стартовойКарта сайтаНаписать администрации
Поиск по сайту
 
Ваше мнение
Какой рейтинг вас больше интересует?
 
 
 
 
 
Проголосовало: 7272
Кнопка
BlogRider.ru - Каталог блогов Рунета
получить код
Сайт Ильи Азарова.
Сайт Ильи Азарова.
Голосов: 2
Адрес блога: http://brainstorm.name
Добавлен: 2008-03-13 01:05:02
 

Способ избежать eval() если данные отдаются в формате массивов PHP

2012-03-25 23:13:51 (читать в оригинале)

eval
PHP
массивы
парсинг

Старая знакомая ситуация: есть что-то, какой-то сервис, отдающий массивы PHP в формате функции var_export(), либо исторически сложилось так что что-то в системе отдает оформленные в код PHP массивы.

Например, ваш скрипт получает строки вида:

$test = "array('gmt' => 'Europe/Moscow',
'sudia3' => '',
'sudia1' => '',
'sudia2' => '',
'pos1' => '4-2-3-1',
'color1' => '#f00',
'pos2' => '4-4-1-1',
'color2' => '#000',
);";

Да, вы не ошиблись, бывает код PHP приходящий в строке. Один из вариантов разбора - eval(). Однако на разнородной системе это и дыра в безопасности.

При этом грамотным решением будет serialize() массива на той стороне, и unserialize() на вашей, или JSON. Однако, предположим, что в вашем проекте исторически сложилось так, что на "той" стороне это исправить на данный момент нельзя. А массив хочется "разобрать" безопасно.

В такой ситуации поможет ставшее стандартным(с PHP 4.2.0) расширение Tokenizer и его функция token_get_all().

Пример простенького разбора массива с ее помощью(пусть он у нас одномерный):

$test = array(
  "'gmt' => 'Europe/Moscow',
  'sudia3' => '',
  'sudia1' => '',
  'sudia2' => '',
  'pos1' => '4-2-3-1',
  'color1' => '#f00',
  'pos2' => '4-4-1-1',
  'color2' => '#000',
);";

$t = token_get_all($test);
$label = array();
foreach( $t as $k => $token) {
  if(!is_array($token) ) {
    unset($t[$k] );
  } else {
    list($id, $val) = $token;
    if ( ($id == T_WHITESPACE) || ($id == T_VARIABLE) || ($id ==
T_BAD_CHARACTER) || ($id == T_OPEN_TAG) || ($id == T_ARRAY) || ($id == T_DOUBLE_ARROW) ) {
      unset($t[$k] );
    }
    else {
   }
  }
}
$c = count($t);
if ($c % 2 == 0) {
  $arr = array();
  $k = array_keys($t);
  $cc = $c /2;
  for ($i = 0; $i < $cc; $i ++) {
    $key = trim($t[$k[2*$i] ] [1], '\'"');
    $val = trim($t[$k[2*$i + 1] ] [1], '\'"');
    $arr[$key] = $val;
  }
  // а вот и наш исходный массив
  var_dump($arr);
} else {
  echo "Parse error\n";
}

Длиннее чем eval()? Да! За код будет спокойнее чем за eval()? Однозначно - да.




 


Самый-самый блог
Блогер ЖЖ все стерпит
ЖЖ все стерпит
по количеству голосов (152) в категории «Истории»


Загрузка...Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.