[PHP] session wordt automatisch ge-unregister-ed

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Topicstarter
hallo,

ik heb nu al van alles geprobeerd maar ik kom er maar niet achter. In mijn usersysteem (met sessies) heb ik 3 ranks (1, 2, 3)...
1 = user
2 = moderator
3 = admin
echter nu doet het probleem zich voor dat wanneer ik inlog als een admin dan kan ik doen en laten wat ik wil (bijv. posts sluiten en daarna weer openen). log ik echter in als een moderator dan kan ik maar één keer iets doen.
er staat netjes op het scherm dat ik een moderator ben. ik sluit een post en daarna staat er niet meer dat ik een moderator ben en ik kan dus ook geen posts meer openen / sluiten. Waar kan het ana liggen dat deze sessie automatisch afsluit? ik heb alles geprobeerd maar ik snap het echt niet... willen jullie m'n script zien??

edit: heb al gezocht en hier gekeken maar dat is het probleem niet

[ Voor 10% gewijzigd door Harrie_ op 30-09-2003 17:52 ]

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:06

gorgi_19

Kruimeltjes zijn weer op :9

Je zou, met behulp van breakpoints, kunnen nagaan waar je sessie wel en waar je sessie niet meer bestaat. Zeker omdat het bij 1 bepaald rechtenniveau voordoet, krijg ik in ieder geval de indruk van een bug in jouw programma.

[ Voor 37% gewijzigd door gorgi_19 op 30-09-2003 17:53 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Topicstarter
De FAQ zegt:

session_register ()

PHP:
1
2
3
4
5
6
7
8
9
10
 <? 
session_start (); 
session_register ( 'blaat' ); 

if ( !session_registered ( 'blaat' ) ) { 
   $blaat = "Blaat"; 
} else { 
   echo 'Blaat was reeds gedefinieerd: ' . $blaat; 
} 
?> 


$_SESSION

PHP:
1
2
3
4
5
6
7
8
9
 <? 
session_start (); 

if ( !isset ( $_SESSION [ 'blaat' ] ) ) { 
   $_SESSION [ 'blaat' ] = 'Blaat'; 
} else { 
   echo 'Blaat was reeds gedefinieerd: ' . $_SESSION [ 'blaat' ]; 
} 
?> 
eerst deed ik altijd

PHP:
1
2
3
4
<?
$s_user_rank = $row["rank"];  
session_register("s_user_rank");
?>


ik checkte dan zo:

PHP:
1
2
3
4
5
6
7
<?
if ($_SESSION['s_user_id']){ 
 // user is ingelogd
} else {
 // user is dus niet ingelogd
}
?>


volgens de FAQ is dat dus fout
ik heb geprobeerd om mij sessions te registeren door te doen zoals in de FAQ staat, nl. zo:

PHP:
1
2
3
4
<?
$s_user_rank = $row["rank"];  
$_SESSION ['s_user_rank'] = $s_user_rank;  
?>


dat werkt dus niet dan slaat hij helemaal geen sessies op...
dus doe ik de sessies toch registeren en dan (zoals in de faq staat) kijken of iemand ingelogd is door:

PHP:
1
2
3
4
5
6
7
<?
if (session_registered ( 's_user_id' ) ) { 
 // user is ingelogd
} else {
 // user is dus niet ingelogd
}
?>


echter dat werkt ook niet dan krijg ik dat session_registered geen geldige functie is...
nu snap ik er echt helemaal niks meer van :-/
[ik hoop dat het duidelijk mag zijn dat ik wel wat geprobeerd heb om m'n probleem op te lossen]

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

Staat Register_globals uit in je php.ini?

Waarschijnlijk staat register_gobals wel aan. Hierdoor kan je geen gebruik maken van $_SESSION en moet je nog gewoon gebruik maken met session_register e.d.
If you are using $_SESSION and disable register_globals, do not use session_register(), session_is_registered() and session_unregister(), if your scripts shall work in PHP 4.2 and earlier. You can use these functions in 4.3 and later.

If you enable register_globals, session_unregister() should be used since session variables are registered as global variables when session data is deserialized. Disabling register_globals is recommended for both security and performance reasons.

[ Voor 90% gewijzigd door dArtagnan op 30-09-2003 19:23 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:12

crisp

Devver

Pixelated

eventuele valkuilen waar je naar zou kunnen kijken:

PHP:
1
2
3
4
5
6
7
session_start();

$s_user_rank = 2;   
$_SESSION ['s_user_rank'] = $s_user_rank;

$s_user_rank = 1;
echo $_SESSION['s_user_rank'];


geeft 1 of 2 naar gelang de waarde van register_globals in php.ini - workaround: nooit dezelfde indexes in $_SESSION gebruiken als de naam van de variabele zelf.

nog 1:

PHP:
1
2
3
4
5
6
7
$s_user_rank = 2;   

if ($s_user_rank = 1) {

  // he, waarom wordt deze uitgevoerd?

}


maar zonder code is het natuurlijk koffiedik kijken ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Topicstarter
ik wil m'n code wel posten maar het is wel best veel is dat geen probleem? ik zal 'm zometeen posten op hoop van zegen maar ik ben niet zo'n nette coder dusse :X

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<? if (isset ($_SESSION['s_user_id'])){ 
    echo "<font>logged in as<br><b>$s_user_username</b></font>";
    echo "<br>";
    echo "<br><font><a href='index.php?page=profile'><font>edit profile</font></a>";
    echo "<br><font><a href='index.php?logout=true'><font>logout</font></a>";
if ($_SESSION['s_user_rank'] > "1"){
    echo "<br><font>a href='index.php?page=adminpage'><font><b>admin page</b></font></a>";
   }
}else{

mysql_connect("x","x","x");  
mysql_select_db("sponsor");  

// dan gaan we een default mode opzetten 
if (!isset($mode)){  
  $mode = "login";  
}  

// ff alle output legen 
$output = "";  

if($mode == "logout"){  
// niks doen uitloggen gaat nl. via index.php :) 
}elseif(!isset($submit)){  
    if ($_GET["login"] == "fout"){
  $output .= "&nbsp;&nbsp;&nbsp;<font>incorrect login</font><br>";
    }
// we willen niet uitloggen, (dus inloggen), maar hebben nog nix ingevuld 
    if ($_GET["login"] != "fout"){
  $output .= "&nbsp;-&nbsp;<a href=\"index.php?page=register\"><font>register</font></a><br>";
  $output .= "&nbsp;-&nbsp;<a href=\"index.php?page=forgotten\"><font>forgot password</font></a><br>";
    }
  $output .= "<p align=\"left\"><form method=\"post\" action=\"login.php\">";  
  $output .= "&nbsp;&nbsp;&nbsp;<input type=\"text\" name=\"username\" size=\"10\"><br>";  
  $output .= "&nbsp;&nbsp;&nbsp;<input type=\"password\" name=\"password\" size=\"10\"><br>";  
  $output .= "&nbsp;&nbsp;&nbsp;<input type=\"submit\" name=\"submit\" value=\"Login\">";  
  $output .= "</form></p>"; 
}else{ 
  //we hebben nu dus wel op SUBMIT geramd
$username = $_REQUEST["username"];
  $md5pass = md5($password);  
  $query = "SELECT * FROM `kliko_users` WHERE `username`='$username' AND `password`='$md5pass'";
  $result = mysql_query($query) or die(mysql_error());  
  $numrows = mysql_num_rows($result);  
  if($numrows == "1"){  
$output .= "<META HTTP-EQUIV=\"refresh\" content=\"1;URL=index.php\">"; 
    $row = mysql_fetch_array($result);  

    // 
    // ff wat vars zetten :) 
    // 
    $s_user_id = $row["id"];  
    session_register("s_user_id");  
     
    $s_user_username = $row["username"];  
    session_register("s_user_username");  
     
    $s_user_email = $row["email"];  
    session_register("s_user_email");  

    $s_user_rank = $row["rank"];  
    session_register("s_user_rank");  

  }else{  
    $output .= "<META HTTP-EQUIV=\"refresh\" content=\"1;URL=index.php?login=fout\">"; 
  }  
}  
echo $output;
}
?>


PHP:
1
2
// note: ik begin niet met session_start(); omdat dit in login.php staat
// en álle pagina's worden geinclude in index.php


het probleem is dus
als s_user_rank = 1 werkt alles perfect
als s_user_rank = 3 werkt alles perfect
als s_user_rank = 2 --> na het uitvoeren van een query waarbij er iets toegevoegd / geupdate word in de dbase is de user uitgelogd (???)

[ Voor 216% gewijzigd door Harrie_ op 30-09-2003 19:04 . Reden: code laten zien :) ]

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:12

crisp

Devver

Pixelated

offtopic:
[rant]}elseif(!isset($submit)){ :r [/rant]


Als je trouwens met superglobals werkt ($_SESSION enzo) mag er nergens in het script meer session_register e.d. voorkomen.
Verder verdient het aanbeveling om dan meteen voor alle variabelen die van buiten komen de superglobals te gebruiken, zo is mij bijvoorbeeld niet duidelijk waar die $submit vandaan komt, en die $mode.
Zet anders eens je error_reporting op E_ALL, misschien komen daar ook nog wat dingen uit.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Topicstarter
crisp schreef op 30 September 2003 @ 19:36:
offtopic:
[rant]}elseif(!isset($submit)){ :r [/rant]


Als je trouwens met superglobals werkt ($_SESSION enzo) mag er nergens in het script meer session_register e.d. voorkomen.
Verder verdient het aanbeveling om dan meteen voor alle variabelen die van buiten komen de superglobals te gebruiken, zo is mij bijvoorbeeld niet duidelijk waar die $submit vandaan komt, en die $mode.
Zet anders eens je error_reporting op E_ALL, misschien komen daar ook nog wat dingen uit.
ik werkt niet altijd met superglobals alleen als dat persé moet
die $mode bijvoorbeeld maak ik alleen ff aan om het script te onderscheiden. vroeger had ik een logout functie in login.php maar die heb ik in index.php gebouwd. feit is dat een user best zelf ?mode=nogwa instellen aangezien dat absoluut geen kwaad kan voor de veiligheid

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:12

crisp

Devver

Pixelated

McLatey schreef op 30 September 2003 @ 20:11:
[...]


ik werkt niet altijd met superglobals alleen als dat persé moet
die $mode bijvoorbeeld maak ik alleen ff aan om het script te onderscheiden. vroeger had ik een logout functie in login.php maar die heb ik in index.php gebouwd. feit is dat een user best zelf ?mode=nogwa instellen aangezien dat absoluut geen kwaad kan voor de veiligheid
Gebruik maken van superglobals wil niet zeggen dat het appenden aan je url niet meer werkt hoor, desnoods gebruik je $_REQUEST - dan maakt het niet uit of het uit een POST of een GET request komt.
Feit is gewoon dat als je altijd met superglobals werkt je niet afhankelijk bent van de instelling van de server, hiermee maak je je scripts dus portable buiten het feit dat het veiliger kan zijn.

Intentionally left blank

Pagina: 1