Onkohan mahdollista laittaa matemaattisia laskukaavoja tietokantaan ja käyttää niitä hyväksi miten käyttäjä haluaa? Esimerkkinä tallentaa ympärän ala kaavan ja kun Formiin avulla annettaan halkaisija, sivu osaisi laskea pallon pinta-alan tietokantaa tallennetun kaavan avulla ja sitten tulostaa tuloksen?
Aikamoisen virityksen saat tehdä tommosta varten.
Se kaava tulee sieltä kannasta merkkijonona, joten sun pitää tehä jonkin moinen parseri joka osaa sitä käsitellä.
Helpommaks tulis tehdä vaan yks php filu ja laittaa jokaiselle vaikka oma funktio
function ympyran_pinta_ala($r) { $pinta_ala = 3.14 * ($r * $r); return $pinta_ala; }
sitten lisäät vaa vielä jonkinmoisen tarkituksen, mikä funktio ajetaan.
Niin no eikai tuo niin hirvittävän vaikea ole. Lyhyesti
Tee formi, joka kerää halutun kaavan/function tiedot
esim. lomakkeella kentät KAAVAN_NIMI, ARVO1, ARVO2, ARVOn...
no arvoja tarpeen mukaan.
Esim. Kehänpituuden laskemiseen riittää yksi arvo, joka on säde eli tallennetaan kenttään ARVO1.
Teet tietokantaan taulukon, jossa ID, KAAVAN_NIMI ja KAAVA normina PHP koodina
Esim.
1, Kehä, $vastaus = $_POST["ARVO1"]*2*PI;
2, Pinta-ala, $vastaus = $_POST["ARVO1"]^2*PI/4;
Sitten teet PHP sivun, jolle html sivulla ollut lomake antaa tiedot. $_POST["KAAVA"]=Keha ja $_POST["ARVO1"]=5.
Teet haun tietokantaan $_POST["KAAVA"] kentään KAAVAN_NIMI ja haet rivin. Seuraavaksi ajat eval()-funktiolla tietokannasta saadun KAAVA. Nyt voit echolla tulostaa $vastaus, muuttujan. Eli suoritat tekstiä koodina eval()-funkkarilla.
Eval vai.....pitääpä koittaa...Juu pointtina tässä hommassa on että sitä kaavaa sitten voisi tosiaan muuttaakin....
Jepa!
Eval toimi ja vielä loistavasti!
Thanks.
Muista sitten, että eval-funktiolla voi suorittaa mitä tahansa PHP-koodia - myös semmoista, joka esim. tuhoaa kaikki tiedostot palvelimelta.
Eli voiko ulkopuolinen sitten käyttöö eval funktiota jotenkin tuhoamaan tiedot palvelimelta?
pidetäänkö tätä funktiota uhkana?
Funktion käytössä pitää olla erittäin huolellinen. Jos suoritettava koodi on itse määrittelemäsi, ei vaaraa tietenkään ole. Mutta jos käyttäjä pääsee vaikuttamaan koodiin, joku ilkiö voi koettaa ujuttaa siihen haitallisia komentoja ja funktiokutsuja. Omassa tapauksessasi pitää olla varma, että käyttäjä antaa kaavaan lukuja eikä mitään muuta. Tämä onnistuu vaikkapa tarkistamalla syöte is_numeric-funktiolla.
Onhan se väärinkäytettynä uhka. Mieti mitä tapahtuu, jos sulla on vaikka seuraavanlainen lauseke: eval("print ".$_POST['ARVO']."*2*234233;"); ja joku antaa $_POST['ARVO'] -muuttujan arvoksi "1; mysql_query('DROP database blaa'); print 1;" . Tietenkin usein tulee vastaan käyttäjän oikeudet, mutta vaara kuitenkin on.
Edit: Ahaa, Laaksonen ehti ensin :)
Juu nuo tarkistuksen on kyllä hyvä tehdä eli heitä sinne alkuun seuraava pätkä ja poista kaavoista $_POST muuttujat kokonaan turvallisuus syistä.
$kaava = mysql_escape_string($_POST["KAAVA"]); if(is_numeric($_POST["ARVO1"]) $arvo1 = $_POST["ARVO1"]; else $arvo1=0; jne.
Hmm....Juu
eiköhän tuo mene....mutta turvallisuuttahan voi parantaa toki silleensä että tietty käyjjäjoukko pääsaa ainoastaan sivuille. eli php + mysql login....vähän niinkuin yhdessä koodivinkissä täällä...
Aihe on jo aika vanha, joten et voi enää vastata siihen.