Wpis z mikrobloga

Mam taki przypadek i nie mam pomysłu jak go rozwiązać.

W zmiennej trzymam kod funkcji, którą do tej pory mogłem utworzyć i uruchomić przy pomocy createfunction() (DEPRECATED od wersji PHP 7.2).

$body = 'return ["time" => microtime(), "args" => $args];';
$fn = create_function('$args', $body);
var_dump($fn('test'));

Oczywiście mogę zrobić funkcję anonimową, ale tam nie wiem jak definiować jej kod w sposób dynamiczny.

$fn = fn($args) => ['time' => microtime(), 'args' => $args];
var_dump($fn('test'));

Czy w grę wchodzi tylko eval/evil?

$body = 'return ["time" => microtime(), "args" => $args];';
$fn = fn($args) => eval($body);
var_dump($fn('test'));

#php
  • 9
@wgasowski: Odpowiedz ogolna - w momencie, w ktorym zaczynamy tworzyc jakies takie "dynamiczne" wynalezki, to trzeba sie cofnac o krok i popatrzec na problem, czy dobrze do niego podeszlismy. Nie wiem, co probujesz zrobic, ale moze nie tedy droga?

Co do evala - jest zly tylko, jezeli do niego w jakis sposob dociera cos, co przyszlo z niezaufanego zrodla, np. od uzytkownika, czy zewnetrznego api. Jezeli ten ulep, ktory produkujesz, nie
@GandalfPl: jasne - zgadzam się, że założenie początkowe może być nieprawidłowe.

To co ma wykonać eval nie będzie pochodziło z niezaufanego źródła. Jego użycie realizuje w 100% moje potrzeby, ale szukam alternatywy.

Rozwiązanie z plikiem tymczasowym gdzieś mi wpadło, ale ilość dodatkowych operacji mnie zniechęciła (być może niesłusznie).

Ogólne założenie jest takie, że muszę udostępnić możliwość podania sposobu obliczania wartości na podstawie różnych zmiennych. Prosty przykład: definiuję zmienną $x i $y,
muszę udostępnić możliwość definiowania ciała funkcji jako pole w cms


@wgasowski: Rak kontent jakich mało. Pozwolić nieprogramistycznym ludziom na wsadzanie kodu. Gorzej. Pozwolić hakerom na zrobienie spustoszenia na serwerze w momencie prostej luki XSS.

NIE IDŹ TĄ DROGĄ.
Mój Wykop


@wgasowski: W takim razie powinienes stworzyc wlasny jezyk wyrazen, zgodny z jezykiem domenowym uzytkownikow, a nastepnie przygotowac parser, ktory przelozy te wyrazenia na odpowiadajacy im kod.

Jednakze zanim zaczniesz to robic, zerknij, czy nie powstal juz gotowiec do tego.

Co wiecej, nie jestem pewien, czy te wyrazenia opracowywalbym po stronie serwera - moze lepiej to zrobic w JSie na froncie, a na backendzie zapisac tylko wynik operacji?