2012-02-25 5 views
0

Я знаю, что найти альтернативы eval() - общая тема, но я пытаюсь сделать то, что я раньше не делал. Я обрабатываю CSV-файлы с известным форматом, и у меня есть правила для обработки данных в зависимости от доступных исходных столбцов.eval альтернатива правилам обработки в PHP?

Вот упрощенный пример того, что я делаю. В этом примере $linedata представляет собой одну строку данных из файла CSV. $key["type"] указывает на столбец Мне нужны данные. Если этот столбец содержит значение «IN», я хочу, чтобы $newcol настроен на «индивидуальный», иначе «организация».

$key["type"] = 12; 
$linedata[12] = 'IN'; 
$rule = '($linedata[($key["type"])] == "IN" ? "individual" : "organization");'; 
eval ('$newcol = ' . $rule); 

So $rule хранит логику. Я могу запустить фильтр в массиве $linedata, чтобы попытаться защитить от вредоносного кода, поступающего из файлов CSV, но мне интересно, есть ли лучший способ хранить и обрабатывать такие правила?

+0

Это мне не ясно, где правила сделаны. Вы пытаетесь оценить код php, полученный из файла csv, или правила, определенные в вашем коде обработки? Если правила определены в вашем коде обработки, почему бы вам просто не использовать функцию? –

+0

Фактически, это поможет увидеть фрагмент данных и обработанный вывод. Кажется, что все, что вы пытаетесь сделать, это сопоставление, и для этого нет необходимости «eval». – netcoder

+0

@netcoder - да, я пытаюсь выполнить сопоставление, но проблема в том, что файлы CSV не всегда имеют столбцы в одном порядке (поэтому я должен определить ключ). Я отредактирую вопрос, чтобы попытаться сделать его более понятным, потому что ответы еще не поставлены. –

ответ

2

Вы не можете хранить произвольный PHP в CSV-файле, а затем ожидать, что он будет работать без вызова eval (или аналогичных функций).

Безопасный способ сделать то, о чем вы просите, - обрабатывать файл как данные, а не код.

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

Другими словами, вы не можете хранить активные «правила» в файле, не интерпретируя их каким-либо образом, и вы не можете одновременно разрешать им содержать произвольный PHP и быть «безопасным». Таким образом, вы можете либо попытаться разобрать и ограничить PHP (не важно, это сложно!), Либо вы можете дать им хороший легкий язык и интерпретировать это. Или, еще лучше, не храните логику в файлах данных.

+0

Спасибо за ответ, просто чтобы быть понятным, правила хранятся в моем коде, а не в CSV. CSV-файл - это просто данные, которые нужно обрабатывать по-разному в зависимости от структуры данных. Я думаю, что я слишком усложняю проблему, и буду обновлять свой вопрос завтра. –

+0

Я думаю, что это лучший ответ, учитывая, насколько плохо я задал вопрос.В моем случае я полностью изменил логику на ряд операторов switch, чтобы избежать вообще eval. –

0

Я был неправильный.


Я могу ошибаться, однако create_function может быть достаточно хорошим.

http://www.php.net/manual/en/function.create-function.php

+0

'create_function' едва ли лучше, чем' eval'. – Borealid

+0

@Borealid Вы правы. Существует слишком много способов создать строку 'GLOBALS' и использовать' $$ '... – Michas

+0

@Borealid Почему это безопаснее? Из руководства PHP: 'Caution Функция create_function() внутренне выполняет eval() и имеет такие же проблемы безопасности, как eval(). ' –

Смежные вопросы