Ik Zit al enige tijd met dit script te rotzooien, maar ik krijg het niet voor elkaar om na het inloggen de juiste (user_id) te krijgen op (show_user.php). Het inloggen lukt wel anders zou je niet door gelinkt worden naar (show_user.php) maar niet met het juiste (user_id) je komt namelijk op een pagina terecht zonder info van die desbetreffende (user). Heeft dit met de session te maken of de link in de header ? Dus mijn vraag is weet iemand toevallig een how to of topic waar dit probleem uitgelegd word? of ziet iemand toevallig gelijk wat ik fout doe ? Alles staat online op http://163.158.253.94/cms en uiteraard het encrypte van de wachtwoorden komt als dit script werkt. Bedankt voor jullie tijd ! (hieronder het login script)


<?php
require_once 'scripts/connect.php';
require_once 'scripts/app_config.php';

if (!session_is_registered('user_id') || !session_is_registered('username'))
{
	// user is not logged in.
    if (isset($_POST['cmdlogin']))
    {
        // retrieve the username and password sent from login form
        // First we remove all HTML-tags and PHP-tags, then we create a md5-hash
        // This step will make sure the script is not vurnable to sql injections.
        
        $u = strip_tags($_POST['username']);
        $p = strip_tags($_POST['password']);
        //Now let us look for the user in the database.
        $query = sprintf("SELECT user_id, username FROM users WHERE username = '$u' AND password = '$p' LIMIT 1;",
            mysql_real_escape_string($u), mysql_real_escape_string($p));
        $result = mysql_query($query);
        // If the database returns a 0 as result we know the login information is incorrect.
        // If the database returns a 1 as result we know  the login was correct and we proceed.
        // If the database returns a result > 1 there are multple users
        // with the same username and password, so the login will fail.
        if (mysql_num_rows($result) != 1)
        {
            // invalid login information
            echo "Wrong username or password!";
            //show the loginform again.
            include "index.php";
        } else {
            // Login was successfull
            $row = mysql_fetch_array($result);
            // Save the user ID for use later
            $_SESSION['user_id'] = $row['user_id'];
              // Save the username for use later
            $_SESSION['username'] = $u;
              // Now we show the user
            header("Location:show_user.php");
        }
		
    } else {
    	 // User is not logged in and has not pressed the login button
    	 // so we show him the loginform
        include "signup.php";
    }
 
} else {
	 // The user is already loggedin, so we show the user
    include "show_user.php";
}
?>
Je gebruikt een hoop oude functies:

session_is_registered()
De MySQL-functies.

Gebruik tegenwoordig netjes isset() in te controleren of een sessie bestaat, en gebruik de MySQLi-functies.
Ook foutafhandeling op je queries is zeker aan te raden.

Ook hoef je geen usernames op te slaan in een sessie. Alleen het ID is al voldoende om je te identificeren.
Dit heb ik ook geprobeerd toen kwam ik op een user_id=0 uit :(


<?php
require_once 'scripts/connect.php';
require_once 'scripts/app_config.php';

if (!session_is_registered('user_id') || !session_is_registered('username'))
{
	// user is not logged in.
    if (isset($_POST['cmdlogin']))
    {
        // retrieve the username and password sent from login form
        // First we remove all HTML-tags and PHP-tags, then we create a md5-hash
        // This step will make sure the script is not vurnable to sql injections.
        
        $u = strip_tags($_POST['username']);
        $p = strip_tags($_POST['password']);
        //Now let us look for the user in the database.
        $query = sprintf("SELECT user_id, username FROM users WHERE username = '$u' AND password = '$p' LIMIT 1;",
            mysql_real_escape_string($u), mysql_real_escape_string($p));
        $result = mysql_query($query);
        // If the database returns a 0 as result we know the login information is incorrect.
        // If the database returns a 1 as result we know  the login was correct and we proceed.
        // If the database returns a result > 1 there are multple users
        // with the same username and password, so the login will fail.
        if (mysql_num_rows($result) != 1)
        {
            // invalid login information
            echo "Wrong username or password!";
            //show the loginform again.
            include "index.php";
        } else {
            // Login was successfull
            $row = mysql_fetch_array($result);
            // Save the user ID for use later
            $_SESSION['user_id'] = $row['user_id'];
              // Save the username for use later
            $_SESSION['username'] = $u;
              // Now we show the user
            header("Location: http://163.158.253.94/cms/show_user.php?user_id=" . mysql_insert_id());
        }
		
    } else {
    	 // User is not logged in and has not pressed the login button
    	 // so we show him the loginform
        include "signup.php";
    }
 
} else {
	 // The user is already loggedin, so we show the user
    include "show_user.php";
}
?>

Waarom gebruik je mysql_insert_id(). Je insert namelijk niks?

Verder lijkt het mij beter om de boel eerst eens goed te herschrijven.
- Ariën - op 06/01/2016 15:26:36

Je gebruikt een hoop oude functies:

session_is_registered()
De MySQL-functies.

Gebruik tegenwoordig netjes isset() in te controleren of een sessie bestaat, en gebruik de MySQLi-functies.
Ook foutafhandeling op je queries is zeker aan te raden.

Ook hoef je geen usernames op te slaan in een sessie. Alleen het ID is al voldoende om je te identificeren.


Denk je dat dit de problemen veroorzaakt ?


[size=xsmall]Toevoeging op 06/01/2016 15:35:43:[/size]

- Ariën - op 06/01/2016 15:30:24

Waarom gebruik je mysql_insert_id(). Je insert namelijk niks?

Verder lijkt het mij beter om de boel eerst eens goed te herschrijven.


Het was voor mij gewoon proberen ik ben een beginner met php, het moest een simpel inlog script worden xD weet jij toevallig een goeie how to voor inlog scripts ?
Het zou kunnen. Het is zeker iets wat je spoedig moet doen voordat je script opeens niet wil draaien als je hosting de PHP-versie updated.

Opzich is er weinig mis met de workflow van je inlogscript. Hoewel ik wel encryptie mis en je verouderde functies gebruikt.
Ik heb thuis een qnap web server staan die niet meer wil updaten dat zou daar dan mee te maken hebben... weet jij een goeie how to met de nieuwste php technieken voor een inlog script ?
Je kan ook XAMPP downloaden, zodat je op je eigen PC een lokale webserver heb. Dan heb je meteen een recente PHP 5.6 draaien.

Zoals ik al zei is de workflow hetzelfde.
- Je moet de MySQLi-functies toepassen, zoals beschreven staat in dit artikel: http://phptuts.nl/view/26/. Voornamelijk is het eigenlijk het vervangen van de connectie, een 'i' toevoegen en een paar parameters toevoegen die naar de connectie verwijzen.
- De session_is_registered() functie schrappen, en hiervoor een isset() gebruiken om je $_SEESION's mee te controleren.
- En natuurlijk je wachtwoord encrypten met [php]password_hash[/php] en [php]password_verify[/php]

Indien het doel van show_user.php het tonen van informatie van de ingelogde gebruiker is, hoef je dit user id niet mee te geven via de URL, maar deze kun je gewoon uit de sessie vissen.

Als ik het bovenstaande script bekijk is dit de landingspagina wanneer een gebruiker inlogt? Ik zou deze dan profile.php ofzo noemen, show_user.php klinkt meer als een publieke pagina waar je profielen kunt beijken.
- Ariën - op 06/01/2016 15:47:24

Je kan ook XAMPP downloaden, zodat je op je eigen PC een lokale webserver heb. Dan heb je meteen een recente PHP 5.6 draaien.

Zoals ik al zei is de workflow hetzelfde.
- Je moet de MySQLi-functies toepassen, zoals beschreven staat in dit artikel: http://phptuts.nl/view/26/. Voornamelijk is het eigenlijk het vervangen van de connectie, een 'i' toevoegen en een paar parameters toevoegen die naar de connectie verwijzen.
- De session_is_registered() functie schrappen, en hiervoor een isset() gebruiken om je $_SEESION's mee te controleren.
- En natuurlijk je wachtwoord encrypten met [php]password_hash[/php] en [php]password_verify[/php]




Als ik deze MySQLi-functies toepas werkt alles dan wel gewoon nog op een webserver met een oudere php versie ?

[size=xsmall]Toevoeging op 06/01/2016 16:25:03:[/size]

Thomas van den Heuvel op 06/01/2016 15:58:09

Indien het doel van show_user.php het tonen van informatie van de ingelogde gebruiker is, hoef je dit user id niet mee te geven via de URL, maar deze kun je gewoon uit de sessie vissen.

Als ik het bovenstaande script bekijk is dit de landingspagina wanneer een gebruiker inlogt? Ik zou deze dan profile.php ofzo noemen, show_user.php klinkt meer als een publieke pagina waar je profielen kunt beijken.


ja dat is indd de bedoelding ! ik ga dit ook gelijk veranderen. ben weer een stapje verder :D thanks !
MySQLi werkt al vanaf PHP 5.0. Dus op je huidige installatie zou het ook moeten werken. De genoemde password-functies daarentegen pas vanaf PHP 5.5. Maar gelukkig is daar anders een'compat'-library voor.

Reageren