@mihelsonkk
nginx, mysql, unix

Php — Хранение формул в БД — eval или есть варианты?

В таблице хранятся куски 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 - то как сделать его безопаснее?
  • Вопрос задан
  • 578 просмотров
Пригласить эксперта
Ответы на вопрос 1
BuriK666
@BuriK666
Компьютерный псих
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы