PHP Sessions veilig?
Maar hoe veilig is dit? Met sessions kan je (volgens mij) toch niet net zoals cookies ingelogd blijven als je de volgende keer terug komt?
Kunnen andere mensen langs deze methode?
je kan beter nooit wachtwoorden opslaan in sessies
Zoek eens achter Session hijacking
Danny Emmerik op 01/09/2011 15:42:43:
Ik ben bezig een beheerpagina te maken en die beveilig ik dmv php sessions. De username en wachtwoord worden opgeslagen en op elke pagina wordt eerst gecontroleerd of deze nog kloppen en dan wordt de pagina weergegeven.
Maar hoe veilig is dit? Met sessions kan je (volgens mij) toch niet net zoals cookies ingelogd blijven als je de volgende keer terug komt?
Kunnen andere mensen langs deze methode?
Maar hoe veilig is dit? Met sessions kan je (volgens mij) toch niet net zoals cookies ingelogd blijven als je de volgende keer terug komt?
Kunnen andere mensen langs deze methode?
Je kunt beter geen wachtwoorden opslaan, niet in session en al helemaal niet in cookies. Je zou bijvoorbeeld een random sha1 hash kunnen opslaan in je database, die in sessions/cookies zetten en vergelijken.
Deze moet neem ik aan ook opgeslagen worden in mijn DB?
Slim om te weten en eigenlijk dom van mij om wachtwoorden in sessies te gebruiken. Maar ik dacht als de username en ww het zelfde zijn weet ik dat ik de goede persoon heb.
Danny Emmerik op 01/09/2011 16:01:31:
Oké bedankt. Ik zal eens kijken hoe ik iedere keer een andere hash kan gebruiken.
Deze moet neem ik aan ook opgeslagen worden in mijn DB?
Slim om te weten en eigenlijk dom van mij om wachtwoorden in sessies te gebruiken. Maar ik dacht als de username en ww het zelfde zijn weet ik dat ik de goede persoon heb.
Deze moet neem ik aan ook opgeslagen worden in mijn DB?
Slim om te weten en eigenlijk dom van mij om wachtwoorden in sessies te gebruiken. Maar ik dacht als de username en ww het zelfde zijn weet ik dat ik de goede persoon heb.
Ik sla altijd 2 sessies op namelijk:
- User id
- Hash
User_id is het nummer van de gebruiker in de database heb je dan een veld genaamd: user_id ingesteld op: Auto_increment en Primary_key.
De hash zet je bij het inloggen in de database en in een sessie.
Bij de pagina's hoef je dus alleen nog maar te controleren of er een gebruiker bestaat met het user_id en of de hash klopt:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
//hash genereren
$rand = sha1( rand( 0, 999 ) );
$query = mysql_query( "SELECT username FROM users WHERE user_id='". mysql_real_escape_string( $_SESSION['user_id'] ) ."' AND hash='". mysql_real_escape_string( $_SESSION['hash'] ) ."'" );
?>
//hash genereren
$rand = sha1( rand( 0, 999 ) );
$query = mysql_query( "SELECT username FROM users WHERE user_id='". mysql_real_escape_string( $_SESSION['user_id'] ) ."' AND hash='". mysql_real_escape_string( $_SESSION['hash'] ) ."'" );
?>
Snap je ;)?
sha1(microtime(true)), deze is iets unieker.
normaal gezien kan je dan niet snel hacken want dan moet je ook nog die code kennen voordat het mogelijk is
Dan moet ik dus ook bij iedere inlog het db veld "hash" updaten.
Wat je tegenwoordig ook steeds vaker ziet is dat je in een applicatie bij het uitvoeren van belangrijke acties je opnieuw je wachtwoord moet invoeren.
session_regenerate_id ?
Kees Schepers op 01/09/2011 23:34:34:
Er is hier een PHP functie voor die dan een nieuwe sessionid maakt en de data overzet zodat je niets kwijt bent maar ben even de naam kwijt..
Ik denk dat je deze bedoelt:
http://php.net/manual/en/function.session-regenerate-id.php
Klopt! tnx :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
if(isset($_POST['submit'])){
$gebruikersnaam = $_POST['gebruikersnaam'];
$wachtwoord = $_POST['wachtwoord'];
if($_POST['gebruikersnaam'] && $_POST['wachtwoord']){
if($_POST['gebruikersnaam'] == '***' && $_POST['wachtwoord'] == '***'){
$hash = sha1(microtime(true));
mysql_query("UPDATE beheer SET hash = '$hash' WHERE gebruikersnaam = '***' AND wachtwoord = '***'") or die (mysql_error());
$sql = "SELECT id,hash FROM beheer WHERE gebruikersnaam = '***' AND wachtwoord = '***'";
$query = mysql_query($sql) or die (mysql_error()."<br>in file ".__FILE__." on line ".__LINE__);
while($beheer = mysql_fetch_object($query)) {
$id = $beheer->id;
$hash2 = $beheer->hash;
}
$_SESSION['id'] = $id;
$_SESSION['hash'] = $hash2;
echo "Je bent succesvol ingelogd. Je id is $id en je hash is $hash.<br><a href='index.php?pagina=beheer_veilig'>Ga nu verder</a> ..";
}
?>
if(isset($_POST['submit'])){
$gebruikersnaam = $_POST['gebruikersnaam'];
$wachtwoord = $_POST['wachtwoord'];
if($_POST['gebruikersnaam'] && $_POST['wachtwoord']){
if($_POST['gebruikersnaam'] == '***' && $_POST['wachtwoord'] == '***'){
$hash = sha1(microtime(true));
mysql_query("UPDATE beheer SET hash = '$hash' WHERE gebruikersnaam = '***' AND wachtwoord = '***'") or die (mysql_error());
$sql = "SELECT id,hash FROM beheer WHERE gebruikersnaam = '***' AND wachtwoord = '***'";
$query = mysql_query($sql) or die (mysql_error()."<br>in file ".__FILE__." on line ".__LINE__);
while($beheer = mysql_fetch_object($query)) {
$id = $beheer->id;
$hash2 = $beheer->hash;
}
$_SESSION['id'] = $id;
$_SESSION['hash'] = $hash2;
echo "Je bent succesvol ingelogd. Je id is $id en je hash is $hash.<br><a href='index.php?pagina=beheer_veilig'>Ga nu verder</a> ..";
}
?>
Waarom zet je dat erin?
Roel van de Water op 05/09/2011 21:16:00:
En je hash is...?!
Waarom zet je dat erin?
Waarom zet je dat erin?
Hash is een gehasht random getal dat word gebruikt als valideren, je moet het zien als soort van "wachtwoord" alleen kun je wachtwoord niet opslaan in een sessie/cookie maar ipv daarvan is een "hash" dus bedacht.