Ik heb een probleempje met een login, ik heb het niet zelf geschreven zoals jullie het van mij gewent zijn, maar toch vraag ik het hier maar. Het werkt met mysqli en php 5.4 en hoger. Er zit ook een registratie script waar het wachtwoord is beveiligt met hash, Maar het heeft alleen geen activatie script, en het werkt op zich prima,. Alleen heb ik een probleempje met inloggen. namelijk dat in de database mijn naam met een hoofdletter staat, maar dat ik kan inloggen zonder hoofdletter. En volgens mij hoef ik alleen in het inlog script iets te wijzigen, zodat de naam wel met een hoofdletter moet worden ingevuld, Alleen ik weet niet wat en waar.
Hier onder het inlog script.


<?php

/**
 * Class login
 * handles the user's login and logout process
 */
class Login
{
    /**
     * @var object The database connection
     */
    private $db_connection = null;
    /**
     * @var array Collection of error messages
     */
    public $errors = array();
    /**
     * @var array Collection of success / neutral messages
     */
    public $messages = array();

    /**
     * the function "__construct()" automatically starts whenever an object of this class is created,
     * you know, when you do "$login = new Login();"
     */
    public function __construct()
    {
        // create/read session, absolutely necessary
        session_start();

        // check the possible login actions:
        // if user tried to log out (happen when user clicks logout button)
        if (isset($_GET["logout"])) {
            $this->doLogout();
        }
        // login via post data (if user just submitted a login form)
        elseif (isset($_POST["login"])) {
            $this->dologinWithPostData();
        }
    }

    /**
     * log in with post data
     */
    private function dologinWithPostData()
    {
        // check login form contents
        if (empty ($_POST['user_name'])) {
            $this->errors[] = "Gebruikernaam is leeg.";
        } elseif (empty($_POST['user_password'])) {
            $this->errors[] = "Wachtwoord is leeg.";
        } elseif (!empty($_POST['user_name']) && !empty($_POST['user_password'])) {

            // create a database connection, using the constants from config/db.php (which we loaded in index.php)
            $this->db_connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

            // change character set to utf8 and check it
            if (!$this->db_connection->set_charset("utf8")) {
                $this->errors[] = $this->db_connection->error;
            }

            // if no connection errors (= working database connection)
            if (!$this->db_connection->connect_errno) {

                // escape the POST stuff
                $user_name = $this->db_connection->real_escape_string($_POST['user_name']);

                // database query, getting all the info of the selected user (allows login via email address in the
                // username field)
                $sql = "SELECT user_name, user_email, user_password_hash
                        FROM users
                        WHERE user_name = '" . $user_name . "' OR user_email = '" . $user_name . "';";
                $result_of_login_check = $this->db_connection->query($sql);

                // if this user exists
                if ($result_of_login_check->num_rows == 1) {

                    // get result row (as an object)
                    $result_row = $result_of_login_check->fetch_object();

                    // using PHP 5.5's password_verify() function to check if the provided password fits
                    // the hash of that user's password
                    if (password_verify($_POST['user_password'], $result_row->user_password_hash)) {

                        // write user data into PHP SESSION (a file on your server)
                        $_SESSION['user_name'] = $result_row->user_name;
                        $_SESSION['user_email'] = $result_row->user_email;
                        $_SESSION['user_login_status'] = 1;

                    } else {
                        $this->errors[] = "Fout wachtwoord. probeer het opnieuw.";
                    }
                } else {
                    $this->errors[] = "Deze gebruikernaam bestaat niet.";
                }
            } else {
                $this->errors[] = "Database connectie  heeft een probleem.";
            }
        }
    }

    /**
     * perform the logout
     */
    public function doLogout()
    {
        // delete the session of the user
        $_SESSION = array();
        session_destroy();
        // return a little feeedback message
        $this->messages[] = "Je bent uitgelogt.";

    }

    /**
     * simply return the current state of the user's login
     * @return boolean user's login status
     */
    public function isUserLoggedIn()
    {
        if (isset($_SESSION['user_login_status']) AND $_SESSION['user_login_status'] == 1) {
            return true;
        }
        // default return
        return false;
    }
}

?>

<?php
$sql = "SELECT user_name, user_email, user_password_hash
        FROM users
        WHERE user_name = '" . $user_name . "' OR user_email = '" . $user_name . "';";
?>


Maar je selecteert op user_name OR user_email. Zodra het e-mailadres klopt, maakt het niet uit of je nu Niek, Jan, Piet of wat dan ook invult.
Let er ook op dat een unieke index hetzelfde doet met case sensitive.
Als de vergelijking Niek = niek onwaar oplevert dan zijn ze beiden uniek.
Ligt het aan mij of mis je ook het wachtwoord in de SELECT-query. Anders kan je met elke juiste gebruikersnaam of username inloggen, terwijl het wachtwoord buiten beschouwing wordt gelaten.
@aar
Regel 83

`user_name` VARBINARY(64) ...
Henk VD Velde op 25/01/2015 15:45:08


`user_name` VARBINARY(64) ...

Dat had ik al voorgsteld.

Ik denk dat de (oorspronkelijke) vraag inmiddels wel beantwoord is trouwens...
-Aar-
kijk eens naar regel 70

het werkt gewoon goed.
Ik kan niet opnieuw registreren met een naam, wachtwoord of email adres dat al bestaat in de database.

Ik heb nu 3 keer geregistreerd met een andere naam, wachtwoord en emailadres, en dat werkt.
Ik kan niet inloggen met Piet met het wachtwoord van Niek.

Het script heb ik hier vandaan: https://github.com/panique/php-login-minimal/
En waarom ik wel alle vormen van 1 naam kan gebruiken weet ik niet het zal misschien wel ergens in gebouw zitten. ik weet het niet.
Maar dat maakt verder ook niet uit de hoofdzaak is dat het goed werkt.
En waarom ik wel alle vormen van 1 naam kan gebruiken weet ik niet het zal misschien wel ergens in gebouw zitten. ik weet het niet.

Dat is hierboven uitgelegd, dat komt door de vorm van de query die je data ophaalt waarbij ook gekeken wordt naar het e-mailadres.

Zie de reactie van Ward.
Wart ven der Put zegt
Maar je selecteert op user_name OR user_email. Zodra het e-mailadres klopt, maakt het niet uit of je nu Niek, Jan, Piet of wat dan ook invult.

Het staat er wel in regel 70.
Maar als ik de index open staat daar username en password met invul velden,
En niet met een email adres en wachtwoord.
Dus het email adres komt helemaal niet in beeld, alleen als je het opvraagt in een ander script bijvoorbeeld zoals in een ledenlijst.
ik heb geprobeerd in te loggen met een email adres en wachtwoord in plaats van gebruikersnaam en wachtwoorden dat lukt ook.
Maar ik kan niet inloggen met een naam en email want dan krijg ik een Fout wachtwoord melding
Ik heb nu Piet met pass piet123 en [email protected] en Truus met paas truus123 en [email protected] in de database staan.
En als probeer in te loggen Piet of [email protected] met het wachtwoord van Truus dan krijg ik fout wachtwoord.

Dus ik kan alleen maar inloggen met username of user_email met het daar bij behorende user_password

Dus zou ik regel 70 moeten veranderd.
Okay, het moge duidelijk zijn dat je niet kunt inloggen als persoon A met het wachtwoord van persoon B, maar heb je nu het oorspronkelijke probleem nog steeds?

Het oorspronkelijke probleem was: het lijkt niet uit te maken of je de gebruikersnaam met hoofd- of kleine letters schrijft, beide worden (ten onrechte) geaccepteerd.

Speelt dat probleem nog steeds?

Je zegt dat je de database en table collation hebt veranderd naar latin1_general_cs, maar dat snijdt niet echt hout want je database-inhoud is (hopelijk) utf8. Hoe luidt nu de creatie-definitie van je users-tabel?

Reageren