Functie veilig?

  • Haihai,
    Ik heb hier een functie voor m'n website.. En ik vraag me af of ie veilig genoeg is. Het word gebruikt om geld van contant naar bank te overzetten. Ergens denk ik dat ik wat vergeten ben... Maar wat. Wat zou ik hier nog aan kunnen verbeteren? De meegegeven $id word al gecontroleerd voordat de methode word aangeroepen.



    Jannick


    Edit: Iets in code gefixed :)

  • Jup, in een ander script word er een variabele aangeroepen die gekoppeld staat aan deze functie. Als die true is dan krijg je dat te zien, als ie false is een melding dat je niet genoeg geld hebt.

  • Dan nog betweter. Waarom zou je extra controles plaatsen als het zo normaal toch echt moet gebeuren. met (int) weet je tenminste zeker dat het een integer is en geen decimaal getal.


    Tevens zie je ook niet hoe $id 'gecontroleerd' wordt wel dus hoe kun je dan een klein scriptje bekijken op veiligheid.

  • Heel leuk, maar voordat de functie word aangeroepen worden zowel de ID als valuta gecontroleerd of het numeriek is, anders roept ie 'm nieteens aan... Zou het beter zijn om het binnen de functie te controleren?


    Edit:
    Wat ik nu heb:


    het is wel dubbel nu volgens mij, maar goed...


    Edit 2: Ok, dat werkte dus niet. *zoekt verder*

  • Jup, heb 't aangepast :) Die (int) hoort voor de variabelen voordat ze gebruikt worden?, dus niet in bijv. function cnb($hoeveel, $id) maar in if ($fetch['contant'] < (int)$hoeveel) ?

  • Citaat van Jannick

    Heel leuk, maar voordat de functie word aangeroepen worden zowel de ID als valuta gecontroleerd of het numeriek is, anders roept ie 'm nieteens aan... Zou het beter zijn om het binnen de functie te controleren?

    Maar dan nog. Door een FAIL van php kan het altijd mis gaan. filter_var heeft bijvoorbeeld ook nog veel fouten waardoor bijvoorbeeld niet legitieme e-mail adressen toch als TRUE returnen.

  • De controle voor e-mailadressen is volgens mij maximaal, er komen explodes, ereg's etc in voor, maar dat terzijde. Voor de geinteresseerden, ik heb 'm hiervan gebruikt: Klik.
    Dit is het script wat ik nu heb:

  • PHP
    function cnb($boeveel, $id)
    {
        $id      = (int) $id;
        $hoeveel = abs((int) $hoeveel);
    
    
        $query = mysql_query("UPDATE `users` SET `bank` = `bank` + ".$hoeveel.", `contant` = `contant` - ".$hoeveel." WHERE `contant` >= ".$hoeveel." AND `id` = ".$id);
        return (bool) mysql_affected_rows();
    }


    Waarom zou je PHP dingen laten controleren wanneer MySQL dit ook kan en je ook nog eens een query bespaart?

  • Waar staat die abs() voor?
    Nou ja, ben nog redelijk aan het leren en ben nog niet bekend met dat soort dingen :P
    Edit: $query word nergens aangeroepen... Is dat nu ook overbodig geworden?

  • Nice... Dit is nu wat ik heb:

    PHP
    function cnb($hoeveel, $id)
    {
        $id      = (int) $id;
        $hoeveel = abs((int) $hoeveel);
    
    
    mysql_query("UPDATE `users` SET `bank` = `bank` + ".$hoeveel.", `contant` = `contant` - ".$hoeveel." WHERE `contant` >= ".$hoeveel." AND `id` = ".$id);
        return (bool) mysql_affected_rows();
    }


    Typfoutje verbeterd ($boeveel). Vraag na aanleiding van je code: Zijn '-haakjes niet nodig in query's? Ik doe altijd '" . $variabele . "', en zie dat jij ze niet gebruikt. Kan je dat overal zo toepassen, en welke voorwaarden zijn er daaraan?

  • Om strings MOET je quotes zetten...
    Als je mysql laat rekenen en het komt een string tegen zal het deze in een integer omzetten... (volgens mij)
    Dus waarom zou je er een string van maken als mysql het daarna weer in een integer omzet...


    Het "$query = " was inderdaad niet nodig...
    Ik dacht eerst even dat ik de query aan mysql_affected_rows() moest geven, dat was niet zo, en toen was ik vergeten dat stukje ook nog wel te halen.

  • Citaat van MrMees

    Ik denk wel dat je nog is_numeric of ctype_digit kan gebruiken om een fout aan te geven. Dat is wel zo makkelijk voor de gebruiker!


    Doe je mooi bij je formulier?


    Citaat van MrMees

    Net zo als met hoeveelheid > contant. Als gebruiker is het wel netjes en handig om z'n fout te laten zien.


    Doe je als cnb() FALSE returned?

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!