Autor Zpráva
nethor
Profil
Vím, že se to tu už několikrát probíralo, ale nenašel jsem uspokojivou odpověď.

Řeším tuto situaci:
Uživatel má zadat do vstupu input/text aritmetický výraz např. '5 * (100-20)'
a pro kontrolu a orientaci mám uživateli poslat přes Ajax za input poslat výsledek.

Pro zpracování výpočtu jsem v PHP funkci nenašel a vytvořené třídy, keré výpočet řeší mi přijdou zbytečně krkolomné.
Proto jsem volil (mnohdy kritizované) zpracování pomocí fce eval().

Zajímalo by mne, jsetli je použítí následujícího scriptu potenciálně nebezpečné.
header("Content-Type: ".$content."; charset=".$charset); 
echo EvalExample($_POST["InputExample"]);

function EvalExample($Example){
    $Example = preg_replace("~,~i",".",$Example); // ...když uživatel napíše desetinnou čárku místo tečky
    $Example = preg_replace("~[^0-9\.\(\)\+\-\*\/]~i"," ",$Example);     // Vyházíme nepovolené znaky
    $Example = trim($Example)    ;     // 
    if($Example != "") {
        @$Eval = eval('$Out = ('.$Example.');');
        $Out = number_format($Out,3,'.',' ')    ;    
        if($Eval === false) {
            $Out = "Error"    ;
        }
        if($Example != $Out) {   // Když nejde o výpočet, výsledek neposíláme.
            return $Out;    
        }
    }
}
quatzael
Profil
nethor:
Nejsem si jistej, ale nemáš tam náhodou chybu přímo v tom eval?? Co tam dělají ty závorky?? To má být nějaká funkce?

@$Eval = eval('$Out = ('.$Example.');');
Keeehi
Profil
Raději bys měl použít něco, co už někdo vytvořil a je to bezpečné. Spousta řešení stejného problému se odkazuje na www.phpclasses.org/package/2695-PHP-Safely-evaluate-mathematical-expressions.html a klon na githubu
nethor
Profil
quatzael:
Ty závorky jsou asi zbytečné, ale určitě tam nevadí.
Keeehi:
To je právě workaround, který mi připadá zbytečný, když se správně ošetří vstup. .. a o to mi šlo v dotazu.
Martin2
Profil *
nethor:
Zajímalo by mne, jsetli je použítí následujícího scriptu potenciálně nebezpečné
Není, ale tvá kalkulačka vlastně nic neumí. Nevidím důvod do toho tahat PHP, sečíst dvě čísla zvládne i JavaScript.
nethor
Profil
Martin2:
Ale jo, umí základní výpočty, např. '3*(5-9)-(59,3/3)*(10/3)' a to mi úplně stačí.

Nevidím důvod do toho tahat PHP
PHP bude zpracovávat vstup pro další výpočty, je lepší použiít stejnou funkci i pro dílčí výsledek.
Fisir
Profil
Reaguji na nethora:
Zajímalo by mne, jsetli je použítí následujícího scriptu potenciálně nebezpečné.
Ano. Přinejmenším riziko dělení nulou a syntaktických chyb, kterým nemáš možnost bez dalšího parseru předejít. Takhle se to prostě nedělá, eval() je evil a vždy riskuješ, že ti něco proklouzne. Raději si vyber z dostupných hotových matematických parserů.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0