Inlogsysteem logt niet in

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rof rof

rof rof

03/05/2017 16:39:37
Quote Anchor link
Ik heb geprobeerd om een login script te maken met php. Nou is het zo dat als ik via het inlog formulier wel terecht kom op de login.php pagina. Na wat troubleshooten kwam ik op het probleem dat hij wel de POST oppakt, maar er verder niks mee doet. Ik maak hierbij gebruik van prepared statements. Hier komt hij niet voorbij. Met een boolean heb ik neer gezet of hij goed is en een SESSION moet aanmaken voor de gebruiker of dat hij fout is en door word verwezen naar het inlog form.

Nu is mijn vraag: Hoe krijg ik het toch voor elkaar dat hij door de prepare heen komt en dat ik gewoon inlog als het goed is en anders het word afgebroken?

- Ariën -:
Titel aangepast van: Men login script werkt niet naar Inlogsysteem logt niet in. Gelieve voortaan duidelijk je probleem- of vraagstelling aan te geven.
Gewijzigd op 04/05/2017 13:15:28 door - Ariën -
 
PHP hulp

PHP hulp

22/12/2024 22:21:07
 
Thomas van den Heuvel

Thomas van den Heuvel

03/05/2017 16:44:21
Quote Anchor link
Hiervoor zullen we toch wat code moeten zien denk ik.

En als je het over prepared statements hebt, bedoel je dan de MySQLi-variant of de PDO-variant (aangenomen dat je MySQL gebruikt)?

Het bovenstaande komt mij een beetje vreemd over, wat bedoel je met "afgebroken"? Loopt de query echt in de soep en/of krijg je een foutmelding?

De enige manier om hier duidelijkheid over te krijgen is dat je je relevante code plaatst zodat we precies kunnen zien wat er gebeurt.
 
Rof rof

rof rof

03/05/2017 16:47:53
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$stmt
= $mysqli->prepare("SELECT * FROM testlogin WHERE username = '".$username."' AND password = '".$password."'");
//var_dump($stmt);
//print_r ($stmt);


$stmt->bind_param('ss', $username, $password);

$results = $stmt->execute();
 
//var_dump($stmt);
$count = mysqli_num_rows($result);
if($count == 1){

    $_SESSION['logged_in'] = true;
    $_SESSION['user'] = $username;

    //header('Refresh: 1; url=beveiligd.php');
    echo 'Je bent succesvol ingelogd. Je wordt doorgestuurd.';
}
else{
   // header('Refresh: 1; url=login_form.php');
    echo 'Deze combinatie van gebruikersnaam en wachtwoord is niet juist!';
}

?>


hierboven is de code waarnaar ik refereer. Ik maak inderdaad gebruik van de MySQLI variant.
het afbreken bedoel ik mee, dat hij de combinatie als foutief ziet en de gebruiker door stuurt naar de inlog pagina.
Gewijzigd op 04/05/2017 13:15:51 door - Ariën -
 
- SanThe -

- SanThe -

03/05/2017 16:55:57
Quote Anchor link
Kijk eens op http://php.net/manual/en/mysqli-stmt.bind-param.php

En $results is niet $result
 
Thomas van den Heuvel

Thomas van den Heuvel

03/05/2017 16:56:28
Quote Anchor link
De bovenstaande manier is niet de correcte manier om prepared statements te gebruiken. Je plakt $username en $password rechtstreeks in een querystring. Dit is zeer gevaarlijk want in deze opzet is er nog steeds SQL-injectie mogelijk.

Het gaat waarschijnlijk mis in het bind_param() deel omdat het aantal placeholders in je querystring (0) niet overeenkomt met het aantal parameters dat je wilt binden (2).

Ik zou zeggen, verdiep je nog eens goed in hoe prepare() precies werkt.

EDIT: en wat @SanThe zegt. Staat tijdens ontwikkeling het melden + weergeven van fouten in je code wel aan? Dan had je dit soort dingen er al meteen uitgehaald waarschijnlijk.
Gewijzigd op 03/05/2017 16:57:52 door Thomas van den Heuvel
 
Rof rof

rof rof

03/05/2017 16:59:54
Quote Anchor link
bedankt voor het reageren, ik zal me hierin verdiepen. Ik gebruik visual studio code en ik heb geen fout meldingen aan staan. Ik heb ook geen idee hoe ik het aan zet.
 
Thomas van den Heuvel

Thomas van den Heuvel

03/05/2017 17:11:38
Quote Anchor link
Zet dit bovenaan in je code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
ini_set('display_errors', 'stdout');
error_reporting(E_ALL);
?>

Dit is alleen voor ontwikkeling. Indien jouw code naar productie gaat wanneer er nog fouten in zitten in combinatie met bovenstaande code dan kan dit potentieel informatie geven over hoe deze fouten uitgebuit kunnen worden.
 
Rof rof

rof rof

04/05/2017 10:46:15
Quote Anchor link
ik heb gekeken naar de bind_param en bind_result in de php manual. Heb ook wat geprobeerd ervan. (ik vond vaak bind_param voor de registratie) m'n registratie pagina werkt wel volledig naar behoren in prepared statements btw. ik heb een paar aanpassingen gedaan, misschien dat ik dezelfde fout nog steeds heb. ik heb even geen idee meer. code hier onder.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
    $username
= strip_tags($_POST['username']);
    $password = strip_tags($_POST['password']);
    //var_dump($_POST);
    $user = mysqli_real_escape_string($mysqli, $username);
    $pass = mysqli_real_escape_string($mysqli, $password);

    //var_dump($pass);

    $stmt = $mysqli->error_list->prepare("SELECT * FROM testlogin WHERE username = ? AND password = ? ");
    //var_dump($stmt);
    $stmt->bind_param('ss', $user, $pass);
    $stmt->execute();

    

    //var_dump($stmt);
    $count = mysqli_num_rows($result);
        if($count == 1){

            $_SESSION['logged_in'] = true;
            $_SESSION['user'] = $username;

            //header('Refresh: 1; url=beveiligd.php');
            echo 'Je bent succesvol ingelogd. Je wordt doorgestuurd.';
        }
else{
        // header('Refresh: 1; url=login_form.php');
            echo 'Deze combinatie van gebruikersnaam en wachtwoord is niet juist!';
        }

    
    $mysqli->close();
?>

- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 04/05/2017 13:16:24 door - Ariën -
 
Ben van Velzen

Ben van Velzen

04/05/2017 11:07:59
Quote Anchor link
1. Als je prepared statements gebruikt hoef je geen escaping meer te doen met mysqli_real_escape_string. Sterker nog, dit moet je heel erg niet doen omdat dit tot dubbele escaping leidt.
2. Waarom selecteer je alle velden in een query als je alleen maar het feit dat een rij terug komt gebruikt? Selecteer dan gewoon als volgt: SELECT 1 FROM ....
 
Rof rof

rof rof

04/05/2017 11:10:21
Quote Anchor link
SELECT username, password FROM

bedoel je meer zoiets?
 
Ben van Velzen

Ben van Velzen

04/05/2017 11:13:58
Quote Anchor link
Waar gebruik je username en password dan? Wanneer je niets gebruikt uit je resultset kun je net zo goed een dummy set selecteren, ik gebruik daar 1 voor, maar elke andere vaste waarde zou werken.
 
Thomas van den Heuvel

Thomas van den Heuvel

04/05/2017 12:22:43
Quote Anchor link
Het introduceren van nieuwe variabelen is ook niet nodig, dit vertroebelt enkel de leesbaarheid. Ik volg ook niet helemaal waarom het nodig is om een username + wachtwoord door strip_tags() te halen? En wat is $mysqli->error_list precies?

Houd het kort, exact en simpel.
 
Rof rof

rof rof

04/05/2017 14:14:17
Quote Anchor link
oke ik ben nog even aan het stoeien geweest en heb besloten om alles naar PDO om te zetten. Ik ben ook een stuk verder gekomen hiermee voor mijn gevoel. Als ik nu een username en wachtwoord even aflees uit de database en die values in de query stop, leest men code er helemaal doorheen en werkt het ook. Maar nog niet met de POST values. Ik heb die strip tags en dergelijke allemaal weggehaald en de onnodige error_list ook. code hieronder te vinden.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$username
= $_POST['username'];
$password = $_POST['password'];

$stmt = $conn->prepare("SELECT * FROM testlogin WHERE username = ? AND password = ?");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);

$stmt->execute();

$count = $stmt->rowCount();
$row = $stmt->fetch();

if($count == 1){

    $_SESSION['logged_in'] = true;
    $_SESSION['username'] = $username;

    //header('Refresh: 1; url=beveiligd.php');
    echo 'Je bent succesvol ingelogd. Je wordt doorgestuurd.';
}
else{
// header('Refresh: 1; url=login_form.php');
    echo 'Deze combinatie van gebruikersnaam en wachtwoord is niet juist!';
}

    
$conn = null;
?>



- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 04/05/2017 14:14:51 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

04/05/2017 14:16:40
Quote Anchor link
Je bent je bewust van het feit dat je je password niet veilig omzet in een hash? En dat het dus als plain-text vergeleken wordt? Niet echt gewenst.....
 
Rof rof

rof rof

04/05/2017 14:17:26
Quote Anchor link
nee snap ik, dit is even voor het testen. Ik heb de hash waardes al klaar liggen en dat was dan ook de volgende stap die ik wou gaan nemen.

Toevoeging op 04/05/2017 14:38:24:

Sorry dat ik zo snel weer reageer, maar ik heb een update op de status.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$username = $_POST['username'];
$password = $_POST['password'];
$hashed = hash('sha512', $password);

$stmt = $conn->prepare("SELECT * FROM testlogin WHERE username = '".$username."' AND password = '".$hashed."'");


Met deze code werkt m'n login systeem. Mijn vraag hierop volgend is dan weer: is dit wel veilig?
 
- Ariën  -
Beheerder

- Ariën -

04/05/2017 15:51:49
Quote Anchor link
Maar niet echt de juiste manier opgebouwd. Kijk eens naar je BindParam die je eerder wel goed leek toe te passen ;-)
Gewijzigd op 05/05/2017 17:13:33 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

05/05/2017 16:59:04
Quote Anchor link
En daarom is bovenstaande code dus *NIET* veilig. En *ook* niet op de juiste manier opgebouwd.

Je rijgt opnieuw rechtstreeks user input in een querystring. Dit moet je op een indirecte manier doen via placeholders en het binden van variabelen hieraan. Dat is de crux van prepared statements die queries veilig(er) maakt.
Gewijzigd op 05/05/2017 17:00:52 door Thomas van den Heuvel
 
Marlies Maalderink

Marlies Maalderink

06/05/2017 08:48:08
Quote Anchor link
Je gebruikt vraagtekens als placeholders en :waarde om ze te binden. Dat zijn twee verschillende manieren door elkaar. probeer dit eens:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$stmt
= $conn->prepare("SELECT * FROM testlogin WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
?>
Gewijzigd op 06/05/2017 08:48:51 door Marlies Maalderink
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.