Zwerfende sessie
Als ik op mijn website ga wordt er een sessie aangemaakt terwijl ik niet gezegd hebt dat hij dat moe doen..
Het probleem is, ik weet niet echt waar die sessie vandaan komt.
De sessie heeft geen data dus het doet niets, maar het is niet de bedoeling dat hij voor iedereen een sessie gaat aanmaken...
Hoe kan ik het best deze sessie vinden?
Ik heb alle sub bestanden even er uit gehaald behalven:
include('handler.inc.php');
dan doet hij het nog steeds, maar als ik de handles.inc.php er uit haal doet hij het niet (logisch want die regelt de sessies).
Maar toch denk ik dat er iets niet klopt.
handles.inc.php:
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
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
/******************************************\
| Sessionhandler & Errorhandler |
\******************************************/
// ----------------------------------------------------------------------------------
// ****** Start: Functie Errorhandler *****
// ----------------------------------------------------------------------------------
function ErrorLogger($errno, $errstr, $errfile, $errline){
$bestand = "errors.php"; // Bestand waar de errors in komen
$debug = true; //true: laat errors zien, false errors worden gelogd
switch($errno){
case E_ERROR: $errtype="Error"; break;
case E_WARNING: $errtype="Warning"; break;
case E_PARSE: $errtype="Parse Error"; break;
case E_NOTICE: $errtype="Notice"; break;
case E_CORE_ERROR: $errtype="Core Error"; break;
case E_CORE_WARNING: $errtype="Core Warning"; break;
case E_COMPILE_ERROR: $errtype="Compile Error"; break;
case E_COMPILE_WARNING: $errtype="Compile Warning"; break;
case E_USER_ERROR: $errtype="User Error"; break;
case E_USER_WARNING: $errtype="User Warning"; break;
case E_USER_NOTICE: $errtype="User Notice"; break;
case E_STRICT: $errtype="Strict Notice"; break;
case E_RECOVERABLE_ERROR: $errtype="Recoverable Error"; break;
default: $errtype="Unknown error (".$errno.")"; break;
}
$referrer=(isset($_SERVER['HTTP_REFERER']))? $_SERVER['HTTP_REFERER'] : __FILE__ ;
$inhoud = "<?php \n\t".'$i++; $errors[$i]["tijd"]="' . date('d/m/Y - H:i:s') . "\";\n\t";
$inhoud.= '$errors[$i]["type"]="' . $errtype . "\";\n\t";
$inhoud.= '$errors[$i]["bestand"]="' . $errfile . "\";\n\t";
$inhoud.= '$errors[$i]["regel"]="' . $errline . "\";\n\t";
$inhoud.= '$errors[$i]["msg"]="' . $errstr . "\";\n\t";
$inhoud.= '$errors[$i]["ip"]="' . $_SERVER['REMOTE_ADDR'] . "\";\n\t";
$inhoud.= '$errors[$i]["request_uri"]="' . $_SERVER['REQUEST_URI'] . "\";\n\t";
$inhoud.= '$errors[$i]["referer"]="' . $referrer . "\";\n";
$inhoud.= "?>\n";
//Error loggen:
if($debug){
echo($errtype.": ".$errstr." op regel ".$errline." in ".$errfile."<br />\n");
return true;
}
if (file_put_contents($bestand, $inhoud, FILE_APPEND) === FALSE) {
exit("<h1>ErrorLogger kon error niet loggen !!!</h1>");
}
@header("Location: errors.php") or die("Er is een fout opgetreden bij het laden van de pagina.");
return true;
}
// ----------------------------------------------------------------------------------
// ****** Einde: Functie Errorhandler *****
// ----------------------------------------------------------------------------------
//Errorlogger instellen als errorhandler + timezone instellen naar onze tijd
set_error_handler("ErrorLogger");
date_default_timezone_set("Europe/Brussels");
// ----------------------------------------------------------------------------------
// ****** Start: Custom Sessionhandler *****
// ----------------------------------------------------------------------------------
$mysqli = new mysqli("localhost", "Gebruiker", "Password", "Database");
// sessie.class wordt aangeroepen
require_once("sessie.class.php");
// Maak een nieuw sessie-object
$ses_obj = new Sessie($mysqli);
// Hier veranderen we de manier waarop sessies door php worden behandeld naar onze (mysql) manier
session_set_save_handler (array($ses_obj, 'open'),
array($ses_obj, 'sluit'),
array($ses_obj, 'lees'),
array($ses_obj, 'schrijf'),
array($ses_obj, 'vernietig'),
array($ses_obj, 'vuilnisman'));
// ----------------------------------------------------------------------------------
// ****** Einde: Custom Sessionhandler *****
// ----------------------------------------------------------------------------------
// Het eigenlijk starten van de sessies. Dit moet altijd ONDER session_set_save_handler komen
session_start();
?>
/******************************************\
| Sessionhandler & Errorhandler |
\******************************************/
// ----------------------------------------------------------------------------------
// ****** Start: Functie Errorhandler *****
// ----------------------------------------------------------------------------------
function ErrorLogger($errno, $errstr, $errfile, $errline){
$bestand = "errors.php"; // Bestand waar de errors in komen
$debug = true; //true: laat errors zien, false errors worden gelogd
switch($errno){
case E_ERROR: $errtype="Error"; break;
case E_WARNING: $errtype="Warning"; break;
case E_PARSE: $errtype="Parse Error"; break;
case E_NOTICE: $errtype="Notice"; break;
case E_CORE_ERROR: $errtype="Core Error"; break;
case E_CORE_WARNING: $errtype="Core Warning"; break;
case E_COMPILE_ERROR: $errtype="Compile Error"; break;
case E_COMPILE_WARNING: $errtype="Compile Warning"; break;
case E_USER_ERROR: $errtype="User Error"; break;
case E_USER_WARNING: $errtype="User Warning"; break;
case E_USER_NOTICE: $errtype="User Notice"; break;
case E_STRICT: $errtype="Strict Notice"; break;
case E_RECOVERABLE_ERROR: $errtype="Recoverable Error"; break;
default: $errtype="Unknown error (".$errno.")"; break;
}
$referrer=(isset($_SERVER['HTTP_REFERER']))? $_SERVER['HTTP_REFERER'] : __FILE__ ;
$inhoud = "<?php \n\t".'$i++; $errors[$i]["tijd"]="' . date('d/m/Y - H:i:s') . "\";\n\t";
$inhoud.= '$errors[$i]["type"]="' . $errtype . "\";\n\t";
$inhoud.= '$errors[$i]["bestand"]="' . $errfile . "\";\n\t";
$inhoud.= '$errors[$i]["regel"]="' . $errline . "\";\n\t";
$inhoud.= '$errors[$i]["msg"]="' . $errstr . "\";\n\t";
$inhoud.= '$errors[$i]["ip"]="' . $_SERVER['REMOTE_ADDR'] . "\";\n\t";
$inhoud.= '$errors[$i]["request_uri"]="' . $_SERVER['REQUEST_URI'] . "\";\n\t";
$inhoud.= '$errors[$i]["referer"]="' . $referrer . "\";\n";
$inhoud.= "?>\n";
//Error loggen:
if($debug){
echo($errtype.": ".$errstr." op regel ".$errline." in ".$errfile."<br />\n");
return true;
}
if (file_put_contents($bestand, $inhoud, FILE_APPEND) === FALSE) {
exit("<h1>ErrorLogger kon error niet loggen !!!</h1>");
}
@header("Location: errors.php") or die("Er is een fout opgetreden bij het laden van de pagina.");
return true;
}
// ----------------------------------------------------------------------------------
// ****** Einde: Functie Errorhandler *****
// ----------------------------------------------------------------------------------
//Errorlogger instellen als errorhandler + timezone instellen naar onze tijd
set_error_handler("ErrorLogger");
date_default_timezone_set("Europe/Brussels");
// ----------------------------------------------------------------------------------
// ****** Start: Custom Sessionhandler *****
// ----------------------------------------------------------------------------------
$mysqli = new mysqli("localhost", "Gebruiker", "Password", "Database");
// sessie.class wordt aangeroepen
require_once("sessie.class.php");
// Maak een nieuw sessie-object
$ses_obj = new Sessie($mysqli);
// Hier veranderen we de manier waarop sessies door php worden behandeld naar onze (mysql) manier
session_set_save_handler (array($ses_obj, 'open'),
array($ses_obj, 'sluit'),
array($ses_obj, 'lees'),
array($ses_obj, 'schrijf'),
array($ses_obj, 'vernietig'),
array($ses_obj, 'vuilnisman'));
// ----------------------------------------------------------------------------------
// ****** Einde: Custom Sessionhandler *****
// ----------------------------------------------------------------------------------
// Het eigenlijk starten van de sessies. Dit moet altijd ONDER session_set_save_handler komen
session_start();
?>
Sessie.class.php:
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
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
class Sessie{
private $mysqli;
private $tabel;
private $controle;
private $max_leven = 30; // Tijd in minuten dat een sessie houdbaar is
/*Constructor, geef mysqli connectie mee in OOP vorm, mogelijkheid tot tabel naam te veranderen*/
public function __construct(mysqli &$mysqli, $tabel="sessies"){
$this->tabel = $tabel;
$this->mysqli = &$mysqli;
$this->controle = sha1($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
}
/* Sessie wordt hier normaal geopend, in ons geval moet er niets gebeuren */
public function open($pad, $naam){
return true;
}
/* Sessie wordt gesloten, even de vuilnisman laten langskomen om te oude sessies op te halen */
public function sluit(){
$this->vuilnisman(0);
return true;
}
/* inlezen van de sessie */
public function lees($sessie_id){
$sessie_leven = time() - ($this->max_leven * 60);
$sql = "SELECT ses_data FROM " . $this->tabel. " WHERE ses_id = '" . $sessie_id . "' AND ses_controle = '" . $this->controle . "'";
$sql.= " AND ses_tijd > " . $sessie_leven;
if($resultaat = $this->mysqli->query($sql)){
$waarde='';
if($resultaat->num_rows==1){
$waardes = $resultaat->fetch_row();
$waarde = $waardes[0];
}
$resultaat->close();
return $waarde;
}else{
return '';
}
}
/* Sessie waarde wordt veranderd */
public function schrijf($sessie_id, $sessie_data){
$sessie_data=$this->mysqli->real_escape_string($sessie_data);
$sql = "UPDATE " . $this->tabel . " SET ses_tijd='" . time() . "', ses_data='" . $sessie_data . "' ";
$sql.= "WHERE ses_id='" . $sessie_id . "' AND ses_controle = '" . $this->controle . "'";
if($this->mysqli->query($sql)){ // Update query uitvoeren
if ($this->mysqli->affected_rows){ // kijken of eer een rij is veranderd, zo niet de rij aanmaken (sql hieronder)
return true;
}
$sql = "INSERT INTO " . $this->tabel . " (ses_id, ses_tijd, ses_start, ses_data, ses_controle) ";
$sql.= "VALUES ('" . $sessie_id ."', '" . time() . "', '" . time() . "', '" . $sessie_data . "', '" . $this->controle . "')";
if($this->mysqli->query($sql)){
return true; // Rij succesvol aangemaakt
}else{
return false; //Rij niet aangemaakt
}
}else{
return false; //Fout bij eerste query
}
}
/* Functie die aangeroepen wordt bij session_destroy() */
public function vernietig($sessie_id){
$sql = "DELETE FROM " . $this->tabel . " WHERE ses_id = '" . $sessie_id . "'"; // Extra controle uitgelaten, niet echt nodig want je logt uit
if ($resultaat = $this->mysqli->query ($sql)) {
return true;
}else{
return false;
}
}
/* De vuilnisman zorgt er voor dat sessies die al te lang bestaan verwijdert worden */
function vuilnisman($leeftijd){
$sessie_leven = time() - ($this->max_leven * 60);
$sql = "DELETE FROM " . $this->tabel . " WHERE ses_tijd < " . $sessie_leven;
if ($this->mysqli->query($sql)){
return true;
}else{
return false;
}
}
}
?>
class Sessie{
private $mysqli;
private $tabel;
private $controle;
private $max_leven = 30; // Tijd in minuten dat een sessie houdbaar is
/*Constructor, geef mysqli connectie mee in OOP vorm, mogelijkheid tot tabel naam te veranderen*/
public function __construct(mysqli &$mysqli, $tabel="sessies"){
$this->tabel = $tabel;
$this->mysqli = &$mysqli;
$this->controle = sha1($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
}
/* Sessie wordt hier normaal geopend, in ons geval moet er niets gebeuren */
public function open($pad, $naam){
return true;
}
/* Sessie wordt gesloten, even de vuilnisman laten langskomen om te oude sessies op te halen */
public function sluit(){
$this->vuilnisman(0);
return true;
}
/* inlezen van de sessie */
public function lees($sessie_id){
$sessie_leven = time() - ($this->max_leven * 60);
$sql = "SELECT ses_data FROM " . $this->tabel. " WHERE ses_id = '" . $sessie_id . "' AND ses_controle = '" . $this->controle . "'";
$sql.= " AND ses_tijd > " . $sessie_leven;
if($resultaat = $this->mysqli->query($sql)){
$waarde='';
if($resultaat->num_rows==1){
$waardes = $resultaat->fetch_row();
$waarde = $waardes[0];
}
$resultaat->close();
return $waarde;
}else{
return '';
}
}
/* Sessie waarde wordt veranderd */
public function schrijf($sessie_id, $sessie_data){
$sessie_data=$this->mysqli->real_escape_string($sessie_data);
$sql = "UPDATE " . $this->tabel . " SET ses_tijd='" . time() . "', ses_data='" . $sessie_data . "' ";
$sql.= "WHERE ses_id='" . $sessie_id . "' AND ses_controle = '" . $this->controle . "'";
if($this->mysqli->query($sql)){ // Update query uitvoeren
if ($this->mysqli->affected_rows){ // kijken of eer een rij is veranderd, zo niet de rij aanmaken (sql hieronder)
return true;
}
$sql = "INSERT INTO " . $this->tabel . " (ses_id, ses_tijd, ses_start, ses_data, ses_controle) ";
$sql.= "VALUES ('" . $sessie_id ."', '" . time() . "', '" . time() . "', '" . $sessie_data . "', '" . $this->controle . "')";
if($this->mysqli->query($sql)){
return true; // Rij succesvol aangemaakt
}else{
return false; //Rij niet aangemaakt
}
}else{
return false; //Fout bij eerste query
}
}
/* Functie die aangeroepen wordt bij session_destroy() */
public function vernietig($sessie_id){
$sql = "DELETE FROM " . $this->tabel . " WHERE ses_id = '" . $sessie_id . "'"; // Extra controle uitgelaten, niet echt nodig want je logt uit
if ($resultaat = $this->mysqli->query ($sql)) {
return true;
}else{
return false;
}
}
/* De vuilnisman zorgt er voor dat sessies die al te lang bestaan verwijdert worden */
function vuilnisman($leeftijd){
$sessie_leven = time() - ($this->max_leven * 60);
$sql = "DELETE FROM " . $this->tabel . " WHERE ses_tijd < " . $sessie_leven;
if ($this->mysqli->query($sql)){
return true;
}else{
return false;
}
}
}
?>
Maar ik zie niet wat er fout gaat..
Mitchel V op 17/03/2011 16:29:41:
De sessie heeft geen data dus het doet niets, maar het is niet de bedoeling dat hij voor iedereen een sessie gaat aanmaken...
Er zit niets in de sessie..
Of snap ik je vraag niet?
Toevoeging op 18/03/2011 14:48:28:
Ik zie nu meer lege sessies, Maar de vraag blijft waar komen ze vandaan :S
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE IF NOT EXISTS `sessies` (
`ses_id` varchar(32) NOT NULL,
`ses_tijd` int(11) NOT NULL,
`ses_start` int(11) NOT NULL,
`ses_data` text NOT NULL,
`ses_controle` varchar(40) NOT NULL,
PRIMARY KEY (`ses_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Gegevens worden uitgevoerd voor tabel `sessies`
--
INSERT INTO `sessies` (`ses_id`, `ses_tijd`, `ses_start`, `ses_data`, `ses_controle`) VALUES
('b67a76508a75a5b12876b35d31aef85b', 1300456405, 1300456405, '', '9aff1b93ad78d5854f339d2741093718a092d9bd'),
('a7600b60a5330dae61c090f425f889dc', 1300455406, 1300455208, 'login_id|s:1:"3";', 'dad4d7269e36ef9190828c966ccc7abf216d4fca'),
('cfe3e86defa24f0a259f39941420ced9', 1300454757, 1300454757, '', 'efa3de99d47458e2787ee605ebf0c2ffbbe8cec5'),
('4e66520bb3e796e8d8e986c3cfd6081e', 1300454756, 1300454756, '', 'efa3de99d47458e2787ee605ebf0c2ffbbe8cec5');
`ses_id` varchar(32) NOT NULL,
`ses_tijd` int(11) NOT NULL,
`ses_start` int(11) NOT NULL,
`ses_data` text NOT NULL,
`ses_controle` varchar(40) NOT NULL,
PRIMARY KEY (`ses_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Gegevens worden uitgevoerd voor tabel `sessies`
--
INSERT INTO `sessies` (`ses_id`, `ses_tijd`, `ses_start`, `ses_data`, `ses_controle`) VALUES
('b67a76508a75a5b12876b35d31aef85b', 1300456405, 1300456405, '', '9aff1b93ad78d5854f339d2741093718a092d9bd'),
('a7600b60a5330dae61c090f425f889dc', 1300455406, 1300455208, 'login_id|s:1:"3";', 'dad4d7269e36ef9190828c966ccc7abf216d4fca'),
('cfe3e86defa24f0a259f39941420ced9', 1300454757, 1300454757, '', 'efa3de99d47458e2787ee605ebf0c2ffbbe8cec5'),
('4e66520bb3e796e8d8e986c3cfd6081e', 1300454756, 1300454756, '', 'efa3de99d47458e2787ee605ebf0c2ffbbe8cec5');
Gewijzigd op 18/03/2011 14:50:08 door Mitchel V
iemand..?
Je gaat niet eerst kijken of je voor een bepaald iemand wel dan niet een session_start moet doen.
En er bestaat op deze manier een grote kans op headers already sent
Dit heeft niets te maken met session_start(); Komt nergens voor. Er wordt een insert gedaan in een tabel en er is ook een delete functie. Lees al je programmatuur goed en verwijder wat je niet nodig hebt. Er is geen kans op headers already sent.
session_start komt wel degelijk voor, anders zal ie geen "zwerfende" sessie hebben
en zal die session save handler ook niets doen en dus ook geen info in een tabel kunnen persen
Regel 89 staat session_start();.
hoe kan ik het beste opsporen waar hij die sessie aanmaakt?
Mitchel V op 20/03/2011 12:49:25:
hoe kan ik het beste opsporen waar hij die sessie aanmaakt?
- SanThe - op 18/03/2011 21:52:51:
Regel 89 staat session_start();.
Maar ik begrijp totaal niet waar jij je druk om maakt.....
Gewijzigd op 20/03/2011 13:07:01 door Noppes Homeland
omdat hij steeds een lege sessie in de DB zet.. dat is toch niet de bedoeling?
Gewijzigd op 20/03/2011 15:06:25 door Wesley PHP
Mitchel V op 20/03/2011 13:57:28:
omdat hij steeds een lege sessie in de DB zet.. dat is toch niet de bedoeling?
Ja, so what
Je maakt je druk om zaken waar je niet durk om hoeft te maken. De garbage cleaner flikkert ze er vanzelf wel weer uit, zodra de sessie verlopen is.
en waar ik mij druk om maakt? het hoort toch niet..
en wat als er dadelijk 100 mensen op de website zitten, hoeveel zinloze sessies gaat hij dan aanmaken