[php][sessions][cookies] vals ingelogd

Pagina: 1
Acties:

  • smaij
  • Registratie: November 2000
  • Laatst online: 16:34
Ik ben mijn inlogsysteem aan het hacken, of hoe je dat wil noemen. Ik probeer dus gegevens en instellingen te veranderen van de browser en browsers om zo een valse inlog of rechten te krijgen over de site.
Ik heb nu mijn browserinstellingen (IE 5.0) zo staan dat SessionCookies niet geaccepteerd word (er word om gevraagd) en dat Cookies geaccepteerd mogen worden. Normaal gesproken geen logische instelling, van een gebruiker van een site, want alleen Cookies worden op de HDD opgeslagen en verdwijnen niet na het afsluiten van het venster.
Iemand logged in en word dus netjes geauthoriseerd.
MAAR:
er word geen sessiecookie geplaats, dus bij elke nieuwe pagina word er geprobeert een sessiecookie te registeren, wat volgens de code succesvol is gelukt. Dit kan omdat ik een cookie opsla die later als men weer op de site komt (nieuw venster) de sessiecookie weer aanmaakt.

Zodra ik dus gegevens over de user opvraag mbv de sessiegegevens in de sessie, komt er dus niks uit... dit is immers logisch, en is een gevolg op het bovenstaande.

Nu kan ik er vanuit gaan dat de user sessiecookies accepteert, en als dit niet het geval is, dat er dan ook geen cookies geaccepteerd wordt. Dit lijkt mij een beetje slordig programmeerwerk, ik moet dus bij het registeren van de sessievariabelen kunnen controleren of dit echt gebeurd is.
PHP:
1
<?function LoginUser($username, $password, $cookie_levensduur){ $username = addslashes($username); $password = addslashes($password); $cookie_levensduur = addslashes( $cookie_levensduur); $Query_Users = mysql_query("SELECT UserID, Active FROM users WHERE UserName = '$username' AND UserPassword = '$password'");   if (mysql_num_rows($Query_Users) == 1){  $Query_Users_Array = mysql_fetch_array($Query_Users);   if ($Query_Users_Array["Active"]){    $Tijd = time();    $Cookie_inhoud_CookieID = RandomCookieID();    $Cookie_inhoud_UserID = $Query_Users_Array["UserID"];    $Ipadres = getenv('REMOTE_ADDR');    if ($cookie_levensduur == "01"){      setcookie ("cookie[1]", $Cookie_inhoud_CookieID, $Tijd + 86400); // regel 70      setcookie ("cookie[2]", $Cookie_inhoud_UserID, $Tijd + 86400); // regel 71      mysql_query("INSERT INTO auth VALUES ('$Cookie_inhoud_CookieID', '$Cookie_inhoud_UserID', '1', '$Ipadres', '$Tijd')");               }    elseif ($cookie_levensduur == "02"){      setcookie ("cookie[1]", $Cookie_inhoud_CookieID, $Tijd + 7*86400);      setcookie ("cookie[2]", $Cookie_inhoud_UserID, $Tijd + 7*86400);      mysql_query("INSERT INTO auth VALUES ('$Cookie_inhoud_CookieID', '$Cookie_inhoud_UserID', '2', '$Ipadres', '$Tijd')");                     }    elseif ($cookie_levensduur == "03"){      setcookie ("cookie[1]", $Cookie_inhoud_CookieID, $Tijd + 28*86400);      setcookie ("cookie[2]", $Cookie_inhoud_UserID, $Tijd + 28*86400);      mysql_query("INSERT INTO auth VALUES ('$Cookie_inhoud_CookieID', '$Cookie_inhoud_UserID', '3', '$Ipadres', '$Tijd')");                      }    $Login_Done = "1";    $Ip_Adres = getenv('REMOTE_ADDR');    $CookieID = $Cookie_inhoud_CookieID;    $UserID = $Cookie_inhoud_UserID;    session_register("Login_Done");    $GLOBALS['Login_Done'] = $Login_Done;    session_register("Ip_Adres");    $GLOBALS['Ip_Adres'] = $Ip_Adres;    session_register("CookieID");    $GLOBALS['CookieID'] = $CookieID;    session_register("UserID");    $GLOBALS['UserID'] = $UserID;    return 1;   }   Else {    return "U heeft dit Useraccount nog niet geactiveerd, wacht op uw emailtje";   } } Else {  return "De Ingevoerde gegevens zijn niet bekend in de database, de user bestaat niet"; }}function setsessie(){ $Cookie_CookieID = addslashes($GLOBALS['HTTP_COOKIE_VARS']['cookie'][1]); $Cookie_UserID = addslashes($GLOBALS['HTTP_COOKIE_VARS']['cookie'][2]); $Query_auth = mysql_query("SELECT Geldig, Last_Accessed, Ip_adres FROM auth WHERE CookieID = '$Cookie_CookieID' AND UserID = '$Cookie_UserID'"); if (mysql_num_rows($Query_auth) == 1){  list($Geldig, $Last_Accessed, $Ip_Adres) = mysql_fetch_row($Query_auth);  $Tijd = time();  switch($Geldig){   case 1:           $Tijd_Geldig = 86400;           break;      case 2:           $Tijd_Geldig = 86400 * 7;           break;       case 3:            $Tijd_Geldig = 86400 * 7 * 4;            break;      }  $Tijd_Geldig_Max = $Last_Accessed + $Tijd_Geldig;  if (($Tijd_Geldig_Max > $Tijd) AND (getenv('REMOTE_ADDR') == $Ip_Adres)){    $Login_Done = "1";    session_register("Login_Done");    $GLOBALS['Login_Done'] = $Login_Done;    session_register("Ip_Adres");    $GLOBALS['Ip_Adres'] = $Ip_Adres;    $CookieID = $Cookie_CookieID;    session_register("CookieID");    $GLOBALS['CookieID'] = $Cookie_CookieID;    $UserID = $Cookie_UserID;    session_register("UserID");    $GLOBALS['UserID'] = $Cookie_UserID;    return 1;  }  else {   return 0;  } } else {  return 0; }}?>

Het begin van een php script ziet er altijd zo uit bij mij:
PHP:
1
<?session_start();include ("./mvnconfig/common.inc.php");include ("./mvnconfig/auth.inc.php");connecttodatabase();if (CheckLogin()){ $lid = 1;}else { $lid = 0;}?>

de functie CheckLogin() is
PHP:
1
<?function CheckLogin(){if ($GLOBALS['HTTP_SESSION_VARS']['Login_Done'] == "1"){  resetcookie();  return 1;  } elseif ($GLOBALS['HTTP_COOKIE_VARS']['cookie'][1] != "") {   return setsessie(); } else {   return 0;   }}?>

De fout zit dus in setsessie(), en eigenlijk al eerder in LoginUser(). Ik denk wel dat dit simpel op te lossen is, door session_is_registered of $test = session_register ipv session_register toch?

Zouden er nog meer instellingen zijn, met netscape of andere browsers, die ik niet gebruik, die dit inlogscript laten denken ingelogd te zijn, maar dat eigenlijk niet is?

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:10
Ten eerste moet je al niet met $GLOBALS en session_register gaan werken, dat is fout |:(

Gebruik ipv daarvan $_SESSION['sessievar'], aangezien het vrijwel onmogelijk is deze te hacken, en ze zijn automatisch global dus ook nog veel nettere code.

Verder worden sessionvars pas geplaatst nadat je doorklikt op een link op een pagina.

Verwijderd

Op woensdag 03 april 2002 18:06 schreef ddc het volgende:
Ten eerste moet je al niet met $GLOBALS en session_register gaan werken, dat is fout |:(

Gebruik ipv daarvan $_SESSION['sessievar'], aangezien het vrijwel onmogelijk is deze te hacken, en ze zijn automatisch global dus ook nog veel nettere code.

Verder worden sessionvars pas geplaatst nadat je doorklikt op een link op een pagina.
Hoezo is session_register fout? Hoe ga je anders variabelen in een sessie opslaan?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02-04 14:17

Janoz

Moderator Devschuur®

!litemod

Op woensdag 03 april 2002 22:38 schreef DiEana het volgende:

[..]

Hoezo is session_register fout? Hoe ga je anders variabelen in een sessie opslaan?
Waneer je een sessionvar initialiseerd met
PHP:
1
<?$HTTP_SESSION_VARS["eenvar"]="een waarde";?>

dan is ie al geregistered. Waarschijnlijk slaat 'fout' meer op het global gedeelte. :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • smaij
  • Registratie: November 2000
  • Laatst online: 16:34
Op woensdag 03 april 2002 18:06 schreef ddc het volgende:
Ten eerste moet je al niet met $GLOBALS en session_register gaan werken, dat is fout |:(

Gebruik ipv daarvan $_SESSION['sessievar'], aangezien het vrijwel onmogelijk is deze te hacken, en ze zijn automatisch global dus ook nog veel nettere code.

Verder worden sessionvars pas geplaatst nadat je doorklikt op een link op een pagina.
Ik weet wat je bedoelt, zie echter mijn vorige topics (hit mijn naam) ik gebruik 4.0.6 geloof ik als php.. en die ondersteund dat nog niet, ik ga binnenkort wel upgraden, maar dan heb ik effe een backup servertje nodig..

Verwijderd

Op woensdag 03 april 2002 23:10 schreef Janoz het volgende:

[..]

Waneer je een sessionvar initialiseerd met
PHP:
1
<?$HTTP_SESSION_VARS["eenvar"]="een waarde";?>

dan is ie al geregistered. Waarschijnlijk slaat 'fout' meer op het global gedeelte. :)
Dat dacht ik nu net ook ;) En natuurlijk moet je je session-variabelen zo opvragen! (en dus niet gewoon $bla)

/me wou weer bijdehand doen ;)

  • smaij
  • Registratie: November 2000
  • Laatst online: 16:34
Ik wou dat het werkte, zoals ik het voor had genomen toen, echter bleek het pas te werken op deze manier, en ik was er ook al achter dat het niet goede code is op deze manier, maar blijkbaar heb ik ergens een instelling fout zitten.. als iemand een test wil maken zonder die globals erin, prima, maar ik heb het zo werkend, en blijf daar eigenlijk wel vanaf :D
Ik ga morgen die ene error oplossen (na mijn laatste tentamen) en dan laat ik jullie weten hoe ik dat gedaan heb, denk ik..

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:10
Op woensdag 03 april 2002 22:38 schreef DiEana het volgende:
Hoezo is session_register fout? Hoe ga je anders variabelen in een sessie opslaan?
Zoals Janoz al suggereerde bedoelde ik fout in de zin van niet veilig :) ;)

  • smaij
  • Registratie: November 2000
  • Laatst online: 16:34
Op donderdag 04 april 2002 09:13 schreef ddc het volgende:

[..]

Zoals Janoz al suggereerde bedoelde ik fout in de zin van niet veilig :) ;)
In welke zin bedoel je niet veilig? dat de user de variabele zelf kan intikken in de adresbalk? of dat ik door een fout in de code, doordat ik globals gebruik, een ongeauthoriseerd persoon authoriseer? :?

  • smaij
  • Registratie: November 2000
  • Laatst online: 16:34
schopje :p

  • smaij
  • Registratie: November 2000
  • Laatst online: 16:34
schopje.. ik heb mijn hoofd effe laten rusten, en ga me dit weekend weer volop bezig houden hiermee.. heb wat topics bekeken, enz..

Het volgende:
Wat is er fout aan GLOBALS en $HTTP_SESSION_VARS samen te gebruiken, ik gebruik php 4.0.6?

Er waarom kan ik geen Session_register gebruiken in combinatie met $HTTP_SESSION_VARS

Diegene die mijn topic vanaf bovenaan hebben willen doorgelezen, is isset($GLOBALS['Login_Done']) nu de juiste manier om de sessie te controleren of ie toch echt aanwezig is op de users systeem, zodat daarna pas een Cookie word aangemaakt?

  • smaij
  • Registratie: November 2000
  • Laatst online: 16:34
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    session_register("Login_Done");
    $GLOBALS['Login_Done'] = $Login_Done;
    if (isset($GLOBALS['Login_Done'])){
        if ($cookie_levensduur == "01"){
        setcookie ("cookie[1]", $Cookie_inhoud_CookieID, $Tijd + 86400); // regel 70
        setcookie ("cookie[2]", $Cookie_inhoud_UserID, $Tijd + 86400); // regel 71
        mysql_query("INSERT INTO auth VALUES ('$Cookie_inhoud_CookieID', '$Cookie_inhoud_UserID', '1', '$Ipadres', '$Tijd')");       
        }
        elseif ($cookie_levensduur == "02"){
        setcookie ("cookie[1]", $Cookie_inhoud_CookieID, $Tijd + 7*86400);
        setcookie ("cookie[2]", $Cookie_inhoud_UserID, $Tijd + 7*86400);
        mysql_query("INSERT INTO auth VALUES ('$Cookie_inhoud_CookieID', '$Cookie_inhoud_UserID', '2', '$Ipadres', '$Tijd')");           
        }
        elseif ($cookie_levensduur == "03"){
        setcookie ("cookie[1]", $Cookie_inhoud_CookieID, $Tijd + 28*86400);
        setcookie ("cookie[2]", $Cookie_inhoud_UserID, $Tijd + 28*86400);
        mysql_query("INSERT INTO auth VALUES ('$Cookie_inhoud_CookieID', '$Cookie_inhoud_UserID', '3', '$Ipadres', '$Tijd')");          
        }
        return 1;
    }
    else {
        return "Uw browser accepteer geen sessiecookie of cookie";
    }

Hier gaat het om.. Ik heb nu isset() erin staan, maar het doet niks.. hoe kan ik dan checken of de sessieinhoud wel echt is aangemaakt.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02-04 14:17

Janoz

Moderator Devschuur®

!litemod

Je kunt het setten van cookies pas controleren op de VOLGENDE pagina. Het setten van een cookie is voor php niks anders dan iets extra's in de header zetten. Of de browser hier vervolgens iets mee doet is door php niet direct te achterhalen.

Daarnaast is het ook met 4.0.6 gewoon mogelijk om met globals uit te werken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • smaij
  • Registratie: November 2000
  • Laatst online: 16:34
Thx.. maar dat is dus bij een sessiecookie ook zo ;(
Dan zou ik haast een systeem moeten verzinnen met redirections, die test of een sessiecookie geaccepteerd word of niet. Dat vind ik echter iets te veel van het goede.. Het is niet dat het te hacken is. maar op het moment dat je nu wilt uitloggen, lukt dat niet zonder sessie Omdat die geen informatie bevat
Pagina: 1