| 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: 11 let
|
|||
0