Controleren gegevens inlogsysteem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Allereerst wil ik even melden dat mijn kennis van PHP niet heel denderend is.
Ik wil voor mijn website graag een inlog/registratie systeem. Het registratie-systeem werkt perfect, maar het inlogsysteem niet.
Wanneer ik probeer in te loggen krijg ik de volgende melding:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in
Op de "lijn" van de melding staat het volgende:
if(mysql_num_rows($result) == 1)
{

Ik heb ook al mysql_result(mysql_query geprobeerd, maar ook dit werkt niet.
Is er een andere oplossing voor het volgende:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    <?php
            include('connect.php');

            if ( isset ( $_POST['submit'] ) ) {
            mysql_connect($host,$gebruiker,$wachtwoord);
            mysql_select_db($dbnaam);
            
            $naam = $_POST['name'];
            $wachtwoord = $_POST['pass'];
            
            $sql="SELECT * FROM klanten WHERE username='$naam' and password='$wachtwoord'";
            $result=mysql_query($sql);
        if(mysql_num_rows($result) == 1)
        {
        echo "ingelogd";
        }
        Else{
        echo "niet ingelogd";
        }
        }
            ?>


Bij voorbaat dank.

Met vriendelijke groet,

William

Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

Je moet controleren of de query is geslaagd. Dat kan zoals hieronder is voorgedaan:
PHP:
1
2
3
4
5
6
<?php
$result = mysql_query('SELECT * WHERE 1=1');
if (!$result) {
    die('Invalid query: ' . mysql_error());
}
?>

Je moet controleren of $result wel een juiste waarde bevat. Maar dit staat ook in handleiding.

[ Voor 14% gewijzigd door CoolGamer op 14-06-2010 19:16 ]

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 11-09 13:55
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in
Blijkbaar stop je in mysql_num_rows() iets dat geen "MySQL result resource" is, maar iets anders.
Wat het dan wel is kun je bekijken met bijvoorbeeld var_dump().

Waarschijnlijk zul je zien dat dit de boolean false is, die mysql_query() blijkbaar heeft geretourneerd.
Waarom die functie een false heeft gegeven in plaats van een resultset kun je zien met mysql_error().
Zet op regel 13 dus eens een "echo mysql_error()" om te zien wat er mis is met de gebruikte SQL.

Kijk ook eens naar mysql_escape_string() en ga na waarom je die zou moeten willen gebruiken.

Acties:
  • 0 Henk 'm!

  • G33rt
  • Registratie: Februari 2002
  • Laatst online: 22-06-2022
Ik hoop alleen wel voor je dat dat niet de code is die je online gaat zetten; nu ben je nogal gevoelig voor SQL-injection. Hint: mysql_real_escape_string().

edit:
Volgende keer wel even voor de zekerheid op F5 drukken...

[ Voor 13% gewijzigd door G33rt op 14-06-2010 19:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, klopt;)

Hardstikke bedankt voor alle reacties!

Als ik het volgende gebruik:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    <?php
            include('connect.php');

            if ( isset ( $_POST['submit'] ) ) {
            mysql_connect($host,$gebruiker,$wachtwoord);
            mysql_select_db($dbnaam);
            
            $naam = $_POST['name'];
            $wachtwoord = $_POST['pass'];
            
            $sql="SELECT * FROM klanten WHERE username='$naam' and password='$wachtwoord'";
            $result=mysql_query($sql);
if (!$result) {
echo "niet ingelogd!";
}
Else{
echo "ingelogd!";
}
}
            ?>

Krijg ik iedere keer wanneer ik iets probeer, of het nou juist is of onjuist de melding:
Niet ingelogd.
Iemand een idee?

Beveiliging ga ik nog mee aan de slag, dit is puur even voor de kennis.

Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
Verwijderd schreef op maandag 14 juni 2010 @ 19:28:
Beveiliging ga ik nog mee aan de slag, dit is puur even voor de kennis.
Kennis van beveiliging lijkt me anders ook noodzakelijk, leer het meteen goed, dat scheelt een hoop.

Verder zie ik in de code nergens mysql_error() gebruikt worden, dus weet je nog steeds niet wat er precies fout gaat. Jouw reactie geeft aan dat (!$result) waar is, dus moet $result false zijn, wat betekent dat er een fout is opgetreden tijdens het uitvoeren van de query.

Overigens is een lege result set ook een geldig resultaat, dus zodra je query succesvol wordt uitgevoerd, maar een lege set oplevert (en dus de combinatie gebruikersnaam/wachtwoord verkeerd is), ben je met jouw code alsnog ingelogd.

[ Voor 25% gewijzigd door EdwinG op 14-06-2010 20:39 . Reden: Reactie uitgebreid n.a.v. reactie hieronder ]

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat snap ik.


Overigens is een lege result set ook een geldig resultaat, waardoor je hier altijd kunt inloggen.::

TheCoolGamer vertelde dat dit wel mogelijk was.

Ik denk niet dat er een error ontstaat, ik kan het uiteraard proberen.
Het probleem is echter het controleren van de query, of de gebruikersnaam wel klopt en dat er vervolgens word ge"echod" of het klopt of niet.

Hardstikke bedankt voor de tips/suggesties.

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
Verwijderd schreef op maandag 14 juni 2010 @ 19:53:
Ik denk niet dat er een error ontstaat, ik kan het uiteraard proberen.
Er is zeer zeker een error, aangezien je altijd de melding "niet ingelogd!" krijgt met je laatste script is de return waarde van de functie mysql_query() false. Volgens de documentatie van die functie is dat een teken dat er iets mis gaat met je query.

Dus of jouw database heeft geen kolom 'username' of 'password', of 1 van de variabelen $naam of $wachtwoord bevat iets dat niet koosjer is.

Wat je kan doen is eens een echo($sql); doen en een die(mysql_error()); zoals hoger al aangegeven.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:03

Creepy

Tactical Espionage Splatterer

Oftewel: gewoon even de documentatie lezen van de door jou gebruikte methodes en vervolgens wat gaan debuggen. Zie ook Programming FAQ - Algemeen - Tips bij debuggen.. Ik stel voor dat je eerst zelf nog even aan de slag gaat ;) Nu is je vraag eigenlijk niet meer dan "ik krijg deze foutmelding en dus is mijn code. Help", en dat is nu net niet de bedoeling.

[ Voor 37% gewijzigd door Creepy op 14-06-2010 20:47 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
  • Alle foutafhandeling mist. Check de return values van _alle_ system calls, en alles dat met mysql_* begint. Misschien is je query wel correct, maar ging het al mis bij de mysql_select().
  • Alle sql escaping mist
  • Escaping van kolomnamen mist. Zaken die op keywords lijken als `username` en `password` kunnen wel een backtick gebruiken.
  • Wachtwoorden mag je nooit plaintext opslaan.
Al met al de volgende keywords om eerst een paar uur te lezen wat je aan het doen bent voordat je iets brouwt dat wachtwoorden van gebruikers gaat lekken: PHP debugging, error handling, sql injection, sql escaping, storing passwords, hash functions.

{signature}


Acties:
  • 0 Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 11-09 16:13
Het zal niet veel impact hebben op je code, maar als je alleen maar een query verstuurd om te kijken of de login goed is, kun je misschien beter SELECT id gebruiken ipv SELECT *. Maakt het script een heel klein beetje sneller, maar elk klein beetje is mooi meegenomen.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

X_lawl_X schreef op maandag 14 juni 2010 @ 23:04:
Het zal niet veel impact hebben op je code, maar als je alleen maar een query verstuurd om te kijken of de login goed is, kun je misschien beter SELECT id gebruiken ipv SELECT *. Maakt het script een heel klein beetje sneller, maar elk klein beetje is mooi meegenomen.
Hoeveel duizend mensen zullen per seconde inloggen op dit systeem denk je?

Maar je hebt wel gelijk hoor :*

[ Voor 4% gewijzigd door CodeCaster op 14-06-2010 23:07 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...

Pagina: 1