Безопасно конвертировать предоставленную пользователем строку массива в массив PHP? - PullRequest
2 голосов
/ 27 января 2010

Пользователи должны иметь возможность вводить массив параметров PHP.

В настоящее время они видят текстовую область, где они должны ввести код PHP, который определяет массив:

<textarea name="foo">
$bar = array( 'key' => 'value' );
</textarea>

Я получаю значение текстовой области, например, строку $ _GET ['foo'].

Как я могу разобрать это, чтобы я мог использовать массив $ bar? Я бы предпочел не использовать eval, если смогу помочь.

Спасибо!

Ответы [ 5 ]

0 голосов
/ 27 января 2010

Если вам абсолютно необходимо, чтобы пользователь определил массив таким образом, вам будет гораздо лучше, если он определит его как json. Его легко конвертировать, и вам не нужно его лексировать, как PHP-код; намного безопаснее, чем eval. Кроме того, json - это легкий и простой способ определения массивов, поэтому он также будет удобнее для них:)

0 голосов
/ 27 января 2010

Использование parse_str() - лучший вариант, если вы не хотите использовать eval():

$str = 'first=value&arr[]=foo+bar&arr[]=baz';

parse_str($str, $arr);

echo $arr['first'];  // value
echo $arr['arr'][0]; // foo bar
echo $arr['arr'][2]; // baz

Функции tokenizer также могут быть опцией, но они будут более сложными.

0 голосов
/ 27 января 2010

О странно. Да, держись подальше от Eval, это напрашивается на неприятности. Вероятно, я бы просто написал посимвольную функцию синтаксического анализа, чтобы убедиться, что ввод находится в правильном формате, а затем использовал бы функции обработки строк php, чтобы получить «ключ» и «значение», и таким образом создать массив.

0 голосов
/ 27 января 2010
if(is_set($_GET['foo'])) // we have something 
{
 // do your security testing and ad it to var $foos
 // now proceed 
  foreach($foos as $foo)
  {
   echo $foo;
  }
}
0 голосов
/ 27 января 2010

Я не уверен, что вы не хотите использовать eval, поскольку это именно для той цели, которую вы описываете. Однако, поскольку оценка пользовательского ввода настолько опасна, поэтому вы пытаетесь избежать этого? Если это так, ваш единственный вариант, вероятно, состоит в том, чтобы проанализировать значение $_GET['foo'], удалить любой опасный или нежелательный код, а затем eval it.

[ Редактировать ] - Новый ответ

Теперь, когда я думаю об этом, если вам нужно простое решение для пользователя для ввода данных, основанных на массивах, посмотрите на parse_ini_string - http://us3.php.net/parse_ini_string.. Он примет строку в следующем формате и даст ассоциативный массив. Вы даже можете использовать многомерные массивы, если они вам нужны.

one = 1
five = 5
animal = BIRD
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...