sessies onveilig, en nu?
Sessies onveilig, cookies ook, WAT NU? De huidige script:
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
25
26
27
28
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
<?php
if (isset($_SESSION['login']))
{
$logintrue = $_SESSION['login'];
if($logintrue=='true')
{
$content['user']['id'] = $_SESSION['id'];
$content['user']['name'] = $_SESSION['username'];
$content['user']['pass'] = $_SESSION['password'];
$check = mysql_query("SELECT * FROM ".$table_pref."members WHERE username='".$content['user']['name']."' AND password='".$content['user']['pass']."' AND id='".$content['user']['id']."'");
$check2 = mysql_num_rows($check);
if($check2=='1')
{
$logintrue2 = 'true';
}
while($row = mysql_fetch_array($check))
{
$content['user']['position'] = $row['position'];
$content['user']['mail'] = $row['mail'];
$content['user']['regon'] = $row['regon'];
}
}
}
else
{
$logintrue2 = 'false';
}
?>
if (isset($_SESSION['login']))
{
$logintrue = $_SESSION['login'];
if($logintrue=='true')
{
$content['user']['id'] = $_SESSION['id'];
$content['user']['name'] = $_SESSION['username'];
$content['user']['pass'] = $_SESSION['password'];
$check = mysql_query("SELECT * FROM ".$table_pref."members WHERE username='".$content['user']['name']."' AND password='".$content['user']['pass']."' AND id='".$content['user']['id']."'");
$check2 = mysql_num_rows($check);
if($check2=='1')
{
$logintrue2 = 'true';
}
while($row = mysql_fetch_array($check))
{
$content['user']['position'] = $row['position'];
$content['user']['mail'] = $row['mail'];
$content['user']['regon'] = $row['regon'];
}
}
}
else
{
$logintrue2 = 'false';
}
?>
Gewijzigd op 31/01/2011 20:52:55 door Phpnuke r
nooit wachtwoorden opslaan in sessies
Dat is mij inderdaad verteld, maar hoe vergelijk je dan? Dan word de wachtwoord niet meegenomen en dan heb je het dus zo dat je alleen username meeneemt en dan maak je het pas makkelijk om te hacken.
Ze kunnen hooguit gestolen worden, maar dat is een probleem waar niet echt veel aan te doen is. Je kan hooguit een fingerprint van de requests maken door de user-agent en het ip te hashen. Wanneer het ip adres dan verandert tijdens de sessie (wat soms voor kan komen) zijn je sessies ongeldig.
Beter kan je gewoon heel goed oppassen voor XSS aanvallen.
Gewijzigd op 31/01/2011 21:04:27 door phpnuke r
Vincent heeft wel een punt, waarom zou je de gebruikersnaam en het wachtwoord opslaan in een sessie of cookie? Je hoeft ze toch niet meer verder te gebruiken als de gebruiker ingelogd is. Alleen de id van de gebruiker heb je nog nodig.
Precies zoals Pim stelt: Je kan hooguit een fingerprint van de requests maken door de user-agent en het ip te hashen en zoals Vincent zegt: nooit wachtwoorden opslaan in sessies. Hiermee bereik je een redelijk optimale beveiliging. Interpreteer het iig niet als ip-adres opslaan want dat is een enorm veelgemaakte fout!
Sessies zijn een noodzakelijk kwaad. HTTP stelt ons niet in staat de ene aanvraag de herkennen als een andere aanvraag opvolgend. Dit is echter noodzakelijk voor functies als inloggen en autorisatie. Om hieromheen te werken bestaan er sessies. Dit is informatie op de server. Om te zorgen dat de server weet welke informatie bij wie hoort is er een 'session identifier', meestal een cookie. Gebruik van cookies is uiteraard gevaarlijk, maar veel is er niet aan te doen.
Net als smf gebruik ik de ids al, voor bijvoorbeeld:
site.nl/index.php?action=profile&i=1
Maar hoe doen zij dat dan?
Het wachtwoord staat in de sessie ook al gehasht (md5) dus gedeeltelijk had ik er al aan gedacht ALS de sessies zouden gekraakt worden.
Als er ingelogd is, dan is er toch ingelogd en is het wachtwoord niet meer nodig...
Verder niet alleen hashen, ook salt gebruiken.
Merijn geurts op 01/02/2011 09:04:15:
En het staat in je database ook gehashed dus wanneer een sessie gestolen wordt is men meteen binnen. Daarom geen wachtwoorden in de sessie opslaan!! Doe wat Pim aanbeveelt.Het wachtwoord staat in de sessie ook al gehasht (md5) dus gedeeltelijk had ik er al aan gedacht ALS de sessies zouden gekraakt worden.
Verder is het belangrijk om bij te houden vanaf welke locatie de sessie komt (ip adres)
Verder browser gegevens etc om te nog meer te beschermen tegen spofen. 100% veilig kan niet (en bestaat niet)
In je cookie sla je eigenlijk niks op, dit is in te lezen door iedereen.
TJVB tvb op 01/02/2011 09:34:46:
Het opslaan van wachtwoorden in sessies kan gebruikt worden om je automatisch uit te loggen als je wachtwoord gewijzigd is.
(...)
(...)
Dat zou ik anders doen.
>bij inloggen word dat gedaan zoals het script in mijn eerste post, alleen nu ook word je ip meegenomen ($_SERVER['REMOTE_ADDR'];). Ditmaal niet in sessies maar in de database. Daar staat het ip adress met welk account het is ingelogd, en die word alleen toegevoegd of verwijderd bij het uitloggen en inloggen.
>Bij controlleren of je ingelogd bent word dus gekeken of de combinatie username<>password bij ingelogde gebruikers staat EN met het juiste ip adress. Mocht de sessie verlopen zijn kan je overnieuw inloggen en word er gekeken of de huidige ip adress al ergens op was ingelogd. Zoja, word deze verwijderd.
Is dat wat? Persoonlijk zie ik het als een mooie verdediging ;)
Aad B op 31/01/2011 21:44:46:
Wat bedoelt Aad hiermee?Precies zoals Pim stelt: Je kan hooguit een fingerprint van de requests maken door de user-agent en het ip te hashen en zoals Vincent zegt: nooit wachtwoorden opslaan in sessies. Hiermee bereik je een redelijk optimale beveiliging. Interpreteer het iig niet als ip-adres opslaan want dat is een enorm veelgemaakte fout!
Gewijzigd op 01/02/2011 10:48:14 door Ozzie PHP
Maar waarom dan niet, ik weet dat er met proxy's valt doorheen te komen maar dan moet diegene toch eerst het ip adress weten?
Gewijzigd op 01/02/2011 13:26:42 door John D
Dan maakt ieder een eigen account aan, kan ook hoor :)
Gewijzigd op 01/02/2011 13:37:31 door phpnuke r