eval альтернатива правилам обработки в PHP? - PullRequest
0 голосов
/ 25 февраля 2012

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012

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

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

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

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

0 голосов
/ 25 февраля 2012

Я был неправ .


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

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

...