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 |
#2 · Zasláno: 2. 12. 2015, 02:48:15
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 |
#3 · Zasláno: 2. 12. 2015, 04:16:58
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 |
#4 · Zasláno: 2. 12. 2015, 10:17:52
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 * |
#5 · Zasláno: 2. 12. 2015, 12:58:14
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 |
#6 · Zasláno: 2. 12. 2015, 17:33:45
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 |
#7 · Zasláno: 2. 12. 2015, 17:52:50
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ů.
|
||
Časová prodleva: 8 let
|
0