Hallo,

ik ben bezig met een registratie script voor m'n website. Ik heb me voorgenomen de beveiliging zo goed als ik kan te maken vanaf het begin.
Is dit script veilig? En waarom geeft mysql_real_escape_string niets terug?


<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $fname = @$_POST['fname'];
    $lname = @$_POST['lname'];
    $uname = @$_POST['uname'];
    $email = @$_POST['email'];
    $password = @$_POST['password'];
    $checkbox = @$_POST['checkbox'];


    $errors = array();

    if(trim($fname)=='') {
        $errors[] = 'U moet uw voornaam invullen';
    }

    if(trim($lname)=='') {
        $errors[] = 'U moet uw achternaam invullen';
    }

    if(trim($uname)=='') {
        $errors[] = 'U moet uw gebruikersnaam invullen';
    }

    if(trim($email)=='') {
        $errors[] = 'U moet uw email invullen';
    }
    
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        
    } else {
        $errors[] = 'U moet een geldig emailadres invullen';
    }

    if(trim($password)=='') {
        $errors[] = 'U moet uw wachtwoord invullen';
    } else {
        $password = password_hash($password, PASSWORD_DEFAULT);
    }
    
    if(!isset($checkbox)) {
        $errors[] = 'U moet de richtlijnen accepteren';
    }
    
    if ($errors==true) {
        $err = true;
    } else {
        $sql = "INSERT INTO users (
        id, fname, lname, uname, email, password
        ) VALUES (
        '', '" . mysqli_real_escape_string($connection, $fname) . "', '" . mysqli_real_escape_string($connection, $lname) . "', '" . mysqli_real_escape_string($connection, $uname) . "', '" . mysqli_real_escape_string($connection, $email) . "', '" . mysqli_real_escape_string($connection, $password) . "'
        )";
        if(mysqli_query($connection, $sql)) {
            echo 'Succes!';
        } else {
            echo "Error: " . $sql . "<br>" . mysqli_error($connection);
        }
    }
}
?>


Alvast bedankt!!!

Mvg
Dank je Eddy, ik zal dat zeker overwegen. Maar de veiligheid is momenteel mijn prioriteit.
- ik zie nog steeds geen character encoding aanduidingen, maar mogelijk vallen deze buiten het script; stel je deze wel expliciet in bij het maken van een connectie met je database (met een _set_charset() functie)? geef je ook het HTML-document een charset-indicatie via een header?

- je kopieert een heleboel variabelen, dit vertroebelt de leesbaarheid; hoe simpeler een script, hoe overzichtelijker (en daarmee veiliger) deze meestal is

- het is beter om dit te doen:
<?php
if (goede situatie) {
    // doe dingen
} else {
    // maak bezwaar
}
?>

in plaats van dit:
<?php
if (niet goede situatie) {
    // maak bezwaar
} else {
    // doe dingen
}
?>

Omdat een ontkenning van "niet goede situatie" niet per definitie een "goede situatie" impliceert.

concreet in jouw geval:
<?php
if (count($errors) == 0) {
    // verwerk input
} else {
    // foutafhandeling
}
?>

En dus niet andersom.
Thomas van den Heuvel op 05/09/2015 20:58:24

- je kopieert een heleboel variabelen, dit vertroebelt de leesbaarheid; hoe simpeler een script, hoe overzichtelijker (en daarmee veiliger) deze meestal is

Bedoel je met het kopiëren van variabelen dit:

<?php
    $fname = @$_POST['fname'];
    $lname = @$_POST['lname'];
    $uname = @$_POST['uname'];
    $email = @$_POST['email'];
    $password = @$_POST['password'];
    $checkbox = @$_POST['checkbox'];
?>


Moet ik dat dan weghalen en overal dit doen:

<?php
    if(trim(@$_POST['fname'])=='') {
        $errors[] = 'U moet uw voornaam invullen';
    }
?>


En wat character encoding betreft: ik weet eigenlijk niet zo goed wat je ermee bedoelt aangezien ik niet super veel van php ken.

Toevoeging op 07/09/2015 18:17:35:


<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $fname = @$_POST['fname'];
    $lname = @$_POST['lname'];
    $uname = @$_POST['uname'];
    $email = @$_POST['email'];
    $password = @$_POST['password'];
    $checkbox = @$_POST['checkbox'];


    $errors = array();

    if(trim($fname)=='') {
        $errors[] = 'U moet uw voornaam invullen';
    }

    if(trim($lname)=='') {
        $errors[] = 'U moet uw achternaam invullen';
    }

    if(trim($uname)=='') {
        $errors[] = 'U moet uw gebruikersnaam invullen';
    }

    if(trim($email)=='') {
        $errors[] = 'U moet uw email invullen';
    }
    
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        
    } else {
        $errors[] = 'U moet een geldig emailadres invullen';
    }

    if(trim($password)=='') {
        $errors[] = 'U moet uw wachtwoord invullen';
    } else {
        $password = password_hash($password, PASSWORD_DEFAULT);
    }
    
    if(!isset($checkbox)) {
        $errors[] = 'U moet de richtlijnen accepteren';
    }
    
    if (count($errors) == 0) {
        $sql = "INSERT INTO users (
        id, fname, lname, uname, email, password
        ) VALUES (
        '', '" . mysqli_real_escape_string($connection, $fname) . "', '" . mysqli_real_escape_string($connection, $lname) . "', '" . mysqli_real_escape_string($connection, $uname) . "', '" . mysqli_real_escape_string($connection, $email) . "', '" . mysqli_real_escape_string($connection, $password) . "'
        )";
        if(mysqli_query($connection, $sql)) {
            echo 'Succes!';
        } else {
            echo "Error: " . $sql . "<br>" . mysqli_error($connection);
        }
    } else {
        $err = true;
    }
}
?>
Ja, dat wordt er bedoeld met het onnodig kopieëren van variabelen. Je kan die $_POST variabelen namelijk prima gebruiken. De '@' moet wel weg, dat is vies want je moet juist geen foutmeldingen onderdrukken. In je .htaccess kan je dit voor 'live' website in 'productie' netjes afvangen en loggen.

De karakter-encoding houdt in welke tekenreeks-encoding je gebruikt. Dit is vaak UTF-8, maar oudere scripts gebruiken vaak ISO-8859-1.

Zie ook: http://www.pfz.nl/wiki/charactersets/
Character encoding: OK

<meta charset="utf-8" />


<?php
mysqli_set_charset($connection, "utf8");
?>


Code is in mijn vorige post ook geüpdatet.
Wat kan ik nog aan deze code verbeteren?

Alvast bedankt voor alle hulp!
Hoe zien je tabellen er uit (welke charsets hebben de gebruikte tabellen en kolommen)?

En zat er al data in deze tabellen? Die data wordt nu niet meer goed ge-encodeerd opgehaald omdat je je connectie-charset hebt veranderd.
Er is nog geen tabel aangemaakt.

Toevoeging op 07/09/2015 21:29:32:

Zijn er nog dingen die ik moet verbeteren of mag ik deze code veilig noemen?
Ik zie er geen problemen in.
Maar gooi het eens (in een afgeschermde omgeving) online en ga eens testen wat voor rottigheid je kan uitvoeren.

Reageren