В таблице хранятся куски php кода, по сути это формула для расчета одного результирующего значения.
Сейчас это реализовано так - входные параметры для формулы определяются , далее происходит include файла php (кеш из бд) - после инклюда переменная ($res, во всех формулах одинаковая схема) просто используется дальше. То есть такой черный ящик.
Формулы не хитрые - там есть ветвления if - elseif -else, присваивания, сравнения и round
UPD Синтаксис очень простой. Пример.
$summa = 0;
$sf = $n_square / $n_floor;
if ($n_square > 30) {$f_square = $n_square;} else {$f_square = 30;}
$f_electr =226;
$f_otopl =164;
$f_vodkan =108;
if ($n_water) $summa += 5000 + $n_square*$f_vodkan;
if ($n_heat) $summa += 5000 + $n_square*$f_otopl;
if ($n_elec) $summa += 5000 + $n_square*$f_electr;
if ($n_wall == 1)
{
if ($n_wall_diameter == 1) {if ($n_floor == 2) $summa +=($f_brevno200-$f_forsten)*$f_square; else $summa +=($f_brevno200 - $f_forsten)*1.66 *$f_square;}
elseif ($n_wall_diameter == 3) {if ($n_floor == 2) $summa +=($f_brevno280-$f_forsten)*$f_square; else $summa +=($f_brevno280 - $f_forsten)*1.66 *$f_square;}
}
elseif ($n_wall == 2)
{
if ($n_wall_section == 1) {if ($n_floor == 2) $summa +=($f_brus160-$f_forsten)*$f_square; else $summa +=($f_brus160 - $f_forsten)*1.66 *$f_square;}
elseif ($n_wall_section == 2) {if ($n_floor == 2) $summa +=($f_brus200-$f_forsten)*$f_square; else $summa +=($f_brus200 - $f_forsten)*1.66 *$f_square;}
}
elseif ($n_wall == 3) {if ($n_floor == 2) $summa +=($f_karkas-$f_forsten)*$f_square; else $summa +=($f_karkas - $f_forsten)*1.66 *$f_square;}
elseif ($n_wall == 4) {if ($n_floor == 2) $summa +=($f_fahverk-$f_forsten)*$f_square; else $summa +=($f_fahverk - $f_forsten)*1.66 *$f_square;}
$summa = round($summa,-3);
Переписываю весь проект и сейчас дошел до этого места. Оставлять как есть по понятным причинам не хочется, но формулы нужно определять в бд.
Первая мысль - поменять кеш+include на eval, завернув в try except, но сильно это не поможет в смысле безопасности. Беспокоит не только исполнение произвольного кода но и возможные ошибки в коде из бд.
Что посоветуете?
Есть ли какой нибудь анализатор простой математики-логики под php - скармливать ему формулу как строку и на выходе получать значение?
Если все таки eval - то как сделать его безопаснее?