[php] Inlogsysteem leest cookie niet uit

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ben bezig met een inlogsysteem voor een website met webshop, de gebruikers zijn gedefineerd in de database en worden geidentificeerd aan de hand van hun emailadres

bestanden:

loginform.php, formulier om in te kunnen loggen
login.php, verwerking van loginform.php
reqlogin.php, checkt of iemand is ingelogd

// loginform.php
PHP:
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
<? 
include ("../db.inc"); 
mysql_connect("$host","$db_user","$db_psw"); 
mysql_select_db("$db_name"); 
$username = $_COOKIE['username']; 
$password = $_COOKIE['password']; 
$sql = "SELECT * FROM users WHERE email='$email' AND password='$password'"; 
$select = mysql_query($sql); 
if(mysql_num_rows($select) == 1) 
{ 
echo 'Ingelogged als '.$_COOKIE['email']; 
echo '<br><a href=/users/logout.php>logout</a>'; 
} 
else 
{ 
echo "<form action=login.php method=post name=login.php id=login.php> 
  Username: 
  <input name=email type=text id=email> 
  <br> 
  Password: 
  <input name=password type=password id=password> 
  <br> 
  <input name=submit type=submit id=submit value=Login> 
</form>"; 
} 
?> 


// login.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<? 
include ("../db.inc"); 
mysql_connect("$host","$db_user","$db_psw"); 
mysql_select_db("$db_name"); 
$sql = "SELECT * FROM users WHERE email='$email' AND password='$password'"; 
$select = mysql_query($sql); 
if(mysql_num_rows($select) == 1) 
{ 
setcookie('email', $email, time()+36000); 
setcookie('password', $password, time()+36000); 
echo "Je bent ingelogd als $email"; 
} 
else 
{ 
echo "De door jou ingevoerde gegevens zijn onjuist"; 
} 
?> 


So far so good, ik krijg namelijk gewoon de melding "Je bent ingelogd als $email". :)

Maar dan begint het, als ik wil gaan checken of een gebruiker is ingelogd loopt het dus mis.

// reqlogin.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<? 
include ("../db.inc"); 
mysql_connect("$host","$db_user","$db_psw"); 
mysql_select_db("$db_name"); 
function is_logged_in() 
{ 
$email = $_COOKIE['email']; 
$password = $_COOKIE['password']; 
$sql = "SELECT * FROM users WHERE email='$email' AND password='$password'"; 
$select = mysql_query($sql); 
if(mysql_num_rows($select) == 1) 
{ 
echo "Ingelogd"; 
} 
else 
{ 
echo "Misklukt"; 
} 
} 
?> 


Verder roep ik in het bestand waar gecontroleerd moet worden of een gebruiker is ingelogd nog de volgende functie aan:

PHP:
1
2
3
4
5
6
7
if(is_logged_in() == 1){ 
//ingelogged, laat pagina zien 
} 
else 
{ 
echo "Niet ingelogd"; 
}


Maar dit resulteert dus in de foutmelding: "MisluktNiet ingelogd". Dus van allebei de stukken een foutmelding.

Ik snap er niks van, ben al een paar avonden hiermee bezig maar ik kom er niet uit, ik hoop dus dat iemand hier me kan vertellen wat ik fout doe.

[ Voor 26% gewijzigd door Verwijderd op 05-05-2003 23:11 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18-09 17:06

gorgi_19

Kruimeltjes zijn weer op :9

Kijk eens naar Tips bij het debuggen. Iets meer foutmeldingen, informatie (hoe zie je SQL statement er uit, bijvoorbeeld?) is denk ik gewenst. Nu kunnen we alleen maar gokken. :)

Een ander verzoek: zet [code=php][/code] tags rondomje code; maakt de boel een stuk duidelijker. :)

Een eerste gok: Superglobals

[ Voor 50% gewijzigd door gorgi_19 op 05-05-2003 23:05 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04 18:06

[ash]

Cookies :9

Misschien staat register globals wel uit en dien je $_POST["email"] te gebruiken ipv $email in login.php.

Verder zou ik je php code maar tussen PHP tags zetten, ziet het er allemaal wat mooier uit :P

Acties:
  • 0 Henk 'm!

  • grolle
  • Registratie: Oktober 2001
  • Laatst online: 15-09 10:26
probeer eens al je variabele uit te lezen met print_r

Acties:
  • 0 Henk 'm!

Verwijderd

Een functie moet iets retourneren, en dat doet is_logged_in() niet.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Je zegt dat de variabelen opzich wel meekomen, dus daar ligt echt aan de cookies lijkt het.
Misschien is het helemaal niet van toepassing, maar met
PHP:
1
import_request_variables("C");
verhielp bij het probleem dat ie geen info uit de cookies haalde :) . Dat omdat register_globals uitstaat bij me.

[ Voor 3% gewijzigd door Cartman! op 06-05-2003 10:13 ]


Acties:
  • 0 Henk 'm!

  • PowerFlower
  • Registratie: Juni 2001
  • Laatst online: 18-09 17:56

PowerFlower

être diable et jouer fleur

Naast het hele globals-probleem: je gebruikt niet toevallig PHP onder IIS? Want de implementatie van cookies in PHP is al niet zo best, maar onder IIS is het echt een ramp. Zelf heb ik vorig jaar een vergelijkbaar probleem gehad, en na het toepassen van alles wat in de MS knowledge base staat en op PHP.net, zelfs het handmatig headeren van cookies, heb ik het gewoon opgegeven en ben ik op Apache overgegaan. Met dezelfde php.ini draait het nu perfect...

Overigens: is de melding die je krijgt niet "MiskluktNiet ingelogd"? Zie regel 17 van je reqlogin.php :P

* PowerFlower bewijst even dat hij echt wel goed gelezen heeft ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 06 May 2003 @ 01:05:
Een functie moet iets retourneren, en dat doet is_logged_in() niet.
Klopt, die functie laat alleen wat tekst zien, en zo zal reqlogin.php nooit werken ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
if(mysql_num_rows($select) == 1) 
{ 
echo "Ingelogd"; 
return true; // <-
} 
else 
{ 
echo "Misklukt"; 
return false; // <-
} 
}

[ Voor 5% gewijzigd door Verwijderd op 06-05-2003 13:43 ]


Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 17-09 21:27

pistole

Frutter

PHP:
1
2
3
$sql = "SELECT * FROM users WHERE email='$email' AND password='$password'"; 
$select = mysql_query($sql); 
if(mysql_num_rows($select) == 1)


Erg gevaarlijk dit. Wat denk je dat er gebeurt als iemand als wachtwoord hetvolgende heeft gedaan
code:
1
blaat' OR 'a'='a

[ Voor 12% gewijzigd door pistole op 06-05-2003 14:06 ]

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

Verwijderd

pistole schreef op 06 May 2003 @ 14:06:
PHP:
1
2
3
$sql = "SELECT * FROM users WHERE email='$email' AND password='$password'"; 
$select = mysql_query($sql); 
if(mysql_num_rows($select) == 1)


Erg gevaarlijk dit. Wat denk je dat er gebeurt als iemand als wachtwoord hetvolgende heeft gedaan
code:
1
blaat' OR 'a'='a
idd, kunnen zelfs ergere dingen gedaan worden in een andere query (; -> data verwijderd bv) of met UNIONs oid kan er belangrijke data gestolen worden. :X

zie Advanced SQL injection paper voor meer info

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Weet je sowieso wel zeker dat die user maar 1 keer in de database staat? Met andere woorden: check de waarde van mysql_num_rows() voor het if-statement, door
PHP:
1
echo mysql_num_rows($select);
te doen. :)

.edit: en dan nog:

PHP:
1
2
3
4
5
6
7
if(is_logged_in() == 1){ 
//ingelogged, laat pagina zien 
} 
else 
{ 
echo "Niet ingelogd"; 
}
Nu laat hij pas de pagina zien als de functie is_logged_in de waarde 1 teruggeeft en dat is nu niet het geval. En: waar en hoe zet je het cookie dan?

[ Voor 41% gewijzigd door RedRose op 06-05-2003 14:27 ]

Sundown Circus


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PowerFlower schreef op 06 May 2003 @ 13:19:
Naast het hele globals-probleem: je gebruikt niet toevallig PHP onder IIS? Want de implementatie van cookies in PHP is al niet zo best, maar onder IIS is het echt een ramp. Zelf heb ik vorig jaar een vergelijkbaar probleem gehad, en na het toepassen van alles wat in de MS knowledge base staat en op PHP.net, zelfs het handmatig headeren van cookies, heb ik het gewoon opgegeven en ben ik op Apache overgegaan. Met dezelfde php.ini draait het nu perfect...

Overigens: is de melding die je krijgt niet "MiskluktNiet ingelogd"? Zie regel 17 van je reqlogin.php :P

* PowerFlower bewijst even dat hij echt wel goed gelezen heeft ;)
Alles draait gewoon op een linux server... en ja, je hebt goed gelezen :D

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
pistole schreef op 06 May 2003 @ 14:06:
PHP:
1
2
3
$sql = "SELECT * FROM users WHERE email='$email' AND password='$password'"; 
$select = mysql_query($sql); 
if(mysql_num_rows($select) == 1)


Erg gevaarlijk dit. Wat denk je dat er gebeurt als iemand als wachtwoord hetvolgende heeft gedaan
code:
1
blaat' OR 'a'='a
Gewoon ervoor zorgen dat zo'n wachtwoord niet mogelijk is, max aantal karakters er aan koppelen dus en het gebruik van ' niet toestaan

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RedRose schreef op 06 May 2003 @ 14:14:
Weet je sowieso wel zeker dat die user maar 1 keer in de database staat? Met andere woorden: check de waarde van mysql_num_rows() voor het if-statement, door
PHP:
1
echo mysql_num_rows($select);
te doen. :)

.edit: en dan nog:

PHP:
1
2
3
4
5
6
7
if(is_logged_in() == 1){ 
//ingelogged, laat pagina zien 
} 
else 
{ 
echo "Niet ingelogd"; 
}
Nu laat hij pas de pagina zien als de functie is_logged_in de waarde 1 teruggeeft en dat is nu niet het geval. En: waar en hoe zet je het cookie dan?
Op dit moment draait alles nog als een test met 2 verschillende gebruikers. Tevens wordt er bij het registreren gecontroleerd of een gebruiker al bestaat aan de hand van het emailadres wat tevens de gebruikersnaam is

Maar goed, ik zal vanavond weer eens hiermee gaan stoeien en hopen dat het gaat werken... alvast bedankt zover :)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 06 May 2003 @ 17:30:
[...]


Gewoon ervoor zorgen dat zo'n wachtwoord niet mogelijk is, max aantal karakters er aan koppelen dus en het gebruik van ' niet toestaan
Gewoon addslashes() ?
Pagina: 1