sessions
ik ben bezig met een site waar een aantal pgina's kunnen worden bezocht door leden
nu heb ik al een registratie formulier waar niks de gegevens in de datbase komen
nu heb ik een form om in te loggen maar hoe maak ik hier nu een sessie van als de leden in willen login en hoe maak ik dan een pagina dat alleen mensen kunnen zien als ze ingelogd zijn
heb ik daarvoor een nieuwe database nodig / tabel om de sessie's in op te slaan ?
ik hoop dat iemand mij kan helpen
alvast bedankt
Ik gok niet superveel, want sessies worden niet in een db opgeslagen maar op de server. Tevens een sessie cookie met de sessie ID erin. Alle gegevens die je in een sessie zet, worden dus op de server opgeslagen.
Gewijzigd op 04/05/2012 15:09:31 door Chris PHP
niet heel veel ben wel al een aardig tijd bezig met mezelf erin verdiepen maar loop hier nu even op vast het is lastig een een juist begin te vinden voor deze stap
Dus gebruik maken van mysql_real_escape_string, htmlspecialchars, etc. Let ook goed op wat je in je sessie zet! Want ondanks dat de sessie op de server wordt opgeslagen, kan de sessie nog wel gehijacked worden!
Dus sla nooit wachtwoorden op in sessies, of andere gevoelige info zoals email adressen, etc.
Er zijn verschillende mogelijkheden om pagina's af te schermen voor mensen die niet ingelogd zijn. je kunt controleren met een if statement of er een bepaald veld in de sessie is ingevult die alleen aangemaakt wordt bij het inloggen.
Dus is het veld ingevult, laat hij de pagina zien. Zoniet redirect hij naar een andere pagina.
Pagina's die gebruik moeten maken van een sessie moet altijd helemaal bovenaan staan (voordat er maar 1 wordtje HTML of andere PHP code komt) en dan de HTML.
Om informatie in en uit een database te krijgen moet je connectie maken met je database, je database selecteren en vervolgens een query draaien om data erin te zetten of eruit te halen.
Zit er hier iets tussen wat je bekend in de oren klinkt?
Toevoeging op 04/05/2012 15:23:52:
@Daan, ik raad nooit aan om een wachtwoord op te slaan in een sessie!
Chris NVT op 04/05/2012 15:22:04:
Dus sla nooit wachtwoorden op in sessies, of andere gevoelige info zoals email adressen
Hij heeft gelijk scrap die laatste sessie met wachtworod maar:p
Heb zin aan het weekend.
Toevoeging op 04/05/2012 15:31:05:
Code (php)
Als je zo een sessie start bij het inloggen is sessie met wachtwoord niet is nodig.
Lijkt me wel raadzaam om te controleren of gebruikersnaam en wachtwoord correct zijn. Zo niet; hoef je geen sessie aan te maken.
Hij gaf aan in zijn eerste post een login form te hebben. Ik ging er dus vanuit dat hij al een methode had om user & ww te checken.
Vandaar dat ik het niet in mijn post had gezet.
@Daan:
Jou stukje code is niet geldig om een gebruikersnaam en wachtwoord te checken. Met die methode kan iedereen met elk willekeurig ww en naam inloggen.
Hij kijkt namelijk alleen of ze niet leeg zijn, maar controleerd niet of de ingevoerde gegevens wel kloppen.
Als je de inlog gegevens uit een bestand haalt, include deze dan in je inlog script en controleer de gegevens.
Hieronder een simpel voorbeeldje.
Code (php)
Als je de gegevens in een database hebt staan zul je eerst een query moeten draaien, je kunt dan gelijk in de query de $_POST['gebruikersnaam'] en $_POST['wachtwoord'] zetten. Zorg wel dat je ze filtered voordat je ze doorgeeft!
Ik raad eerder aan het zo te doen:
Code (php)
1
2
3
4
2
3
4
<?php
$usr = mysql_real_escape_string ($_POST['gebruikersnaam']);
$md5pwd = mysql_real_escape_string (md5 ($_POST['wachtwoord']));
?>
$usr = mysql_real_escape_string ($_POST['gebruikersnaam']);
$md5pwd = mysql_real_escape_string (md5 ($_POST['wachtwoord']));
?>
En dan dus $usr en $md5pwd in je string zetten zodat alles gefiltered en enigzins beveiligd is voordat het ingevoerd wordt.
Gewijzigd op 07/05/2012 07:57:17 door Chris PHP
Chris NVT op 07/05/2012 07:46:31:
De mysql_real_escape_string is hier overbodig. Eventuele rare characters worden er al uitgehaald in md5(). md5() geeft namelijk een hexadecimaal nummer terug, daar kunnen dus nooit characters in zitten die je SQL query op zijn kop zetten.
Erwin H op 07/05/2012 09:21:14:
De mysql_real_escape_string is hier overbodig. Eventuele rare characters worden er al uitgehaald in md5(). md5() geeft namelijk een hexadecimaal nummer terug, daar kunnen dus nooit characters in zitten die je SQL query op zijn kop zetten.
Chris NVT op 07/05/2012 07:46:31:
De mysql_real_escape_string is hier overbodig. Eventuele rare characters worden er al uitgehaald in md5(). md5() geeft namelijk een hexadecimaal nummer terug, daar kunnen dus nooit characters in zitten die je SQL query op zijn kop zetten.
Klopt, maar ik heb mijn eigen aangewent alle invoer die door gebruikers wordt aangeleverd richting databases op deze manier te strippen. Ongeacht of ik het ww nu hash of niet, zo voorkom je dat je het op plekker per ongeluk vergeet.
Tevens kan het geen kwaad, om dit te gebruiken.
Als je een getal verwacht, kan je beter casten dan escapen.
Niet alleen beschermt je dit tegen injection, maar het zal ook mySQL-fouten verminderen.
bv.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$sql = "SELECT ... FROM users
WHERE
username = '" . mysql_real_escape_string($_POST['username']) . "'
OR
points = " . (int) $_POST['points'] . "
";
?>
$sql = "SELECT ... FROM users
WHERE
username = '" . mysql_real_escape_string($_POST['username']) . "'
OR
points = " . (int) $_POST['points'] . "
";
?>
(zie ook intval() en floatval() op php.net )
Gewijzigd op 07/05/2012 14:24:37 door Kris Peeters
alvast bedankt
Code (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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
session_start();
if( $_SERVER['REQUEST_METHOD'] == 'POST') // Controle of er op de knop is gedrukt.
{
if(!empty($_POST['email']) AND !empty($_POST['wachtwoord'])) // Controle of alles is ingevult.
{
include_once 'config.php'; // Connectie met database.
$email = mysql_real_escape_string($_POST['email']); // Gevaren voor sql injectie weren dmv. mysql_real_.......
$wachtwoord = mysql_real_escape_string($_POST['wachtwoord']);
$sql = ("SELECT email, wachtwoord FROM members WHERE email='". $email . "' AND wachtwoord='" . $wachtwoord . "'"); // Selecteer user waar de gebruiker overeenkomt met ingevoerde pas
$uitvoer = mysql_query($sql);
$controle = mysql_num_rows($uitvoer); //Uitvoer van inlog
if($controle != 1)
{
//VERDERE VERWERKING. (DIT is aanjou, bijv. sessie ofziets?
}
}
}
php?>
session_start();
if( $_SERVER['REQUEST_METHOD'] == 'POST') // Controle of er op de knop is gedrukt.
{
if(!empty($_POST['email']) AND !empty($_POST['wachtwoord'])) // Controle of alles is ingevult.
{
include_once 'config.php'; // Connectie met database.
$email = mysql_real_escape_string($_POST['email']); // Gevaren voor sql injectie weren dmv. mysql_real_.......
$wachtwoord = mysql_real_escape_string($_POST['wachtwoord']);
$sql = ("SELECT email, wachtwoord FROM members WHERE email='". $email . "' AND wachtwoord='" . $wachtwoord . "'"); // Selecteer user waar de gebruiker overeenkomt met ingevoerde pas
$uitvoer = mysql_query($sql);
$controle = mysql_num_rows($uitvoer); //Uitvoer van inlog
if($controle != 1)
{
//VERDERE VERWERKING. (DIT is aanjou, bijv. sessie ofziets?
}
}
}
php?>
Dus als er 1 resultaat uitkomt, voer je deze niet uit... Je moet die uitroepteken daar weghalen, en een verwerking er in zetten. bijvoorbeeld:
$controle = mysql_num_rows($uitvoer); //Uitvoer van inlog
if($controle != 1)
{
$_SESSION['email'] == $email;
//VERDERE VERWERKING. (DIT is aanjou, bijv. sessie ofziets?
}
}
}
php?>
maar kan ik er van uitgaan dat de session is gestart of zie ik dit nu verkeerd
en staat de session start(); hier goed of moet hij ook boven de php tag staan
alvast bedankt
De session_start() start een sessie, en deze moet aan het begin van je document staan. Als ik het goed heb wordt daarmee een session cookie verzonden en de sessie aangemaakt. Deze moet op elke pagina waarop je de sessie gebruikt, helemaal aan het begin, maar na de ?<php tags komen.
Daarnaast moet je kijken naar je verwerking en foutcontrole. Als er nu een fout optreed, zal de gebruiker niks te zien krijgen.
Als laatste:
if($controle != 1)
moet
if($controle = 1)
zijn!!!
oke ja ik weet het moet php leren en hoop zo van andere mensen ook veel te leren dit is alleen weer een nieuw stuk voor mij en hoop hier wat nieuws te leren
maar ik hang dus de complete code aan mijn inlog form en zet dan op de pagina's die beveiligd moeten zijn session start(); kan ik daarna de email checken en eventueel een if statement zetten voor als er geen sessie is en door verwijzen naar de inlog pagina ?
hoop dat jij me want kan leren
http://www.phphulp.nl/php/script/beveiliging/login-system-v101/511/
PS lees ff de reacties ivm een aantal fouten
Martin Essink op 08/05/2012 21:47:59:
Als laatste:
if($controle != 1)
moet
if($controle = 1)
zijn!!!
if($controle != 1)
moet
if($controle = 1)
zijn!!!
Dan wel met dubbel == graag.
if($controle == 1)
Martin Essink op 08/05/2012 22:04:15:
http://www.phphulp.nl/php/script/beveiliging/login-system-v101/511/
PS lees ff de reacties ivm een aantal fouten
PS lees ff de reacties ivm een aantal fouten
Script is wel acht jaar oud, he?
Stefan H op 08/05/2012 21:31:51:
oke dus zoiets als dit
$controle = mysql_num_rows($uitvoer); //Uitvoer van inlog
if($controle != 1)
{
$_SESSION['email'] == $email;
//VERDERE VERWERKING. (DIT is aanjou, bijv. sessie ofziets?
}
}
}
php?>
maar kan ik er van uitgaan dat de session is gestart of zie ik dit nu verkeerd
en staat de session start(); hier goed of moet hij ook boven de php tag staan
alvast bedankt
$controle = mysql_num_rows($uitvoer); //Uitvoer van inlog
if($controle != 1)
{
$_SESSION['email'] == $email;
//VERDERE VERWERKING. (DIT is aanjou, bijv. sessie ofziets?
}
}
}
php?>
maar kan ik er van uitgaan dat de session is gestart of zie ik dit nu verkeerd
en staat de session start(); hier goed of moet hij ook boven de php tag staan
alvast bedankt
Wat SanThe zegt over je if ($controle = 1), tevens zie ik nog een foutje.
@Martin, als je een voorbeeld geeft, geef dan een correct voorbeeld. Nu maak je de zelfde fout als de TS. Je kijkt nu of $_SESSION['email'] gelijk is aan $email i.p.v. dit toe te wijzen.
Je laat in je if statment (als $controle 1 is) nu weer controleren of $_SESSION['email'] gelijk is aan $email, want hier gebruik je == (betekent is gelijk aan).
Ik neem aan dat je hier het email adres wil opslaan in een sessie en niet controleren?
Hieronder je gecorrigeerde 'test' script.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$controle = mysql_num_rows($uitvoer); //Uitvoer van inlog
if($controle == 1)
{
$_SESSION['email'] = $email;
//VERDERE VERWERKING. (DIT is aanjou, bijv. sessie ofziets?
}
}
}
?>
$controle = mysql_num_rows($uitvoer); //Uitvoer van inlog
if($controle == 1)
{
$_SESSION['email'] = $email;
//VERDERE VERWERKING. (DIT is aanjou, bijv. sessie ofziets?
}
}
}
?>
Let wel dat deze $controle functie die je nu uitvoerd alleen maar werkt met 1 record! Als je in de toekomst of verder in je site meerdere rows/records tegelijk gaat invoegen of bewerken dan zal mysql_num_rows(); welleens meer dan 1 row/record kunnen bevatten.
Dat betekent dus dat hij niets doet aangezien $controle dan niet gelijk is aan 1 maar misschien wel a 2 of 10. Net hoeveel records tegelijk je update/invoert.
Gewijzigd op 09/05/2012 09:54:02 door Chris PHP
Code (php)
1
2
3
4
2
3
4
<?php
$wachtwoord = mysql_real_escape_string($_POST['wachtwoord']);
$sql = ("SELECT email, wachtwoord FROM members WHERE email='". $email . "' AND wachtwoord='" . $wachtwoord . "'");
?>
$wachtwoord = mysql_real_escape_string($_POST['wachtwoord']);
$sql = ("SELECT email, wachtwoord FROM members WHERE email='". $email . "' AND wachtwoord='" . $wachtwoord . "'");
?>
dat je wachtwoorden niet geencrypt opslaat? Dat is natuurlijk ook een enorme no-no. Gebruik voor wachtwoorden altijd een encryptie functie.
Leesvoer hierover:
http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html