webForumDet fria alternativet

Hindra/försvåra, att kunna ta en annans $_SESSION

PHP

8 svar · 670 visningar · startad av yador

Medlem sedan mars 2004455 inlägg
Frågan#1

Hejsan allihopa :)

Hur pass mycket försvårar denna klassen att man kan ta en annans $_SESSION om man anropar ok() funktion flitigt för att kolla om besökaren är inloggad eller ej.

<?php
session_start();

class Authentication
{
	public static function ok()
	{
		if(!isset($_SESSION['user']))
		{
			return false;
		}
		if($_SESSION['user']['privatedata']['remote_addr'] != $_SERVER['REMOTE_ADDR'])
		{
			return false;
		}
		if($_SESSION['user']['privatedata']['http_user_agent'] != $_SERVER['HTTP_USER_AGENT'])
		{
			return false;
		}
		return true;
	}
	
	public static function setValue($a,$b)
	{
		$_SESSION['user']['userdata'][$a] = $b;
	}
	
	public static function getValue($a)
	{
		if(!isset($_SESSION['user']['userdata'][$a]))
		{
			return false;
		}
		return $_SESSION['user']['userdata'][$a];
	}
	
	
	public static function Destroy()
	{
		$_SESSION = array();
		if(isset($_COOKIE[session_name()]))
		{
			setcookie(session_name(), '', time()-42000);
    	}
    	session_destroy();
    }
	
	public static function Create($a)
	{
		$_SESSION['user']['privatedata']['remote_addr'] = $_SERVER['REMOTE_ADDR'];
		$_SESSION['user']['privatedata']['http_user_agent'] = $_SERVER['HTTP_USER_AGENT'];
		$_SESSION['user']['userdata'] = $a;
	}
}
?>

Om t.ex besökare A snor besökare B session kaka så kommer han/hon plötsligt få alla rättigheter som besökare B hade om jag inte tänker fel. Hindrar ok() funktionen detta? Eller kanske php redan håller koll på detta så det är onödigt?

Tack på förhand!

Medlem sedan juni 20081 inlägg
#2

Jämför sessions-koden med ett IP nummer i databasen så bör väll säkerheten öka markant.

Medlem sedan mars 2004455 inlägg
#3

Ju, jag tror det med, men undrade mest om redan php håller koll på detta redan. Man tittar ju runt på massa sidor men jag har aldrig sett någon använda sig av detta så kanske php redan kollade sådant automatiskt?

Medlem sedan mars 20041 505 inlägg
#4

När PHP startar en session så lagras session-id som en cookie i besökarens webbläsare.
Cookien fungerar alltså som en nyckel så att besökaren kommer åt sin egen session.
Men om någon annan skurk snappar upp session-id:t så kan man skapa en likadan cookie för att kidnappa sessionen.
Så det är väl rimligt att en besökare inte byter IP eller User_agent under sessionens livstid.
Såvitt jag vet kollar inte PHP detta själv utan man får göra en extra koll.
Ditt förslag kan nog funka men jag vet inte vad som är den bästa lösningen.

Medlem sedan mars 2004455 inlägg
#5

Okej, men då är det ju bra :) Kom att tänka på en sak, på skolor så finns det ofta massor av datorer, vissa av dem har säkert samma IP nummer och antagligen samma webbläsare, om någon kille eller tjej sniffar upp en session kaka som då sänds så kommer den personen gå förbi systemet. Kan man på något sätt separera dessa 2 från varandra i så fall. Skulle det dessutom höja säkerheten om jag kollade också om personen redan var inloggad och om den var det inte acceptera inloggningen, via att t.ex när man loggar in så sätts värdet true i en databas och sedan false när man loggar ut. Därmed skulle jag väl försäkra mig att enbart en kan vara inloggad samtidigt? Eller det kanske är overkill?

Medlem sedan juni 20034 013 inlägg
#6

Om man kommer åt cookien så är man inloggad så det höjer inte säkerheten att kolla om folk redan är inloggade. Dock använder jag den metoden för licenskontroll, så att inte fler personer än kunden betalt för ska kunna använda systemet.

Ett större problem för dig är nog den mänskliga faktorn. Folk brukar glömma att logga ut, så sessionen ligger kvar till nästa person som kommer till datorn.

Medlem sedan mars 20041 505 inlägg
#7

Tyvärr så får man väldigt lite information om en klient, dvs. besökaren.
Man har typ bara http-variabler som Remote_addr och User_agent att gå på.
Och denna info är dessutom inte tillförlitlig eftersom besökaren inte alltid skickar den.
T.ex. så blockerar Norton Internet Security ofta dessa uppgifter.
Så det är svårt, om inte omöjligt att skilja två datorer på samma lokala nätverk från varandra...

Medlem sedan maj 20012 237 inlägg
#8

Sen kan det vara bra atta köra session_regenerate_id() varje gång en användares access-level förändras.

Googla efter om ämnet... ;)

Medlem sedan mars 2004455 inlägg
#9

tydal
Okej, men finns det skydd mot den mänskliga faktorn då? Kan man hindra att det inte går att trycka bakåt när man har loggat ut och/eller när man går ifrån domänen och sedan tillbaka? På gmail så har jag för mig att det inte går att trycka bakåt när man har loggat ut, hur fixar man det?

Troxy
Okej, jag förstår.

jme
Det där med session_regenerate_id() verkade intressant nu när jag gjorde en enkel sökning. Det måste jag kolla in mer imorgon.

Tack för allt hittills allihopa :)

256 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)