Sessie in database
Ik neem aan dat de code in je openingspost de inhoud van session.php is? Zo ja, dan zal je nog ergens "new SessionManager()" aanroepen (ergens voor session_start()) want immers alleen dan wordt session_set_save_handler aangeroepen.
Op regel43 van het eerste blok staat 'vraagteken' dit is natuurlijk ? (dit even gedaan ivm dat het er dan niet uitziet in deze post door afbreken)
handler.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<?php
/******************************************\
| Sessionhandler & Errorhandler |
\******************************************/
// ----------------------------------------------------------------------------------
// ****** Start: Functie Errorhandler *****
// ----------------------------------------------------------------------------------
function ErrorLogger($errno, $errstr, $errfile, $errline){
$bestand = "errors.php"; // Bestand waar de errors in komen
$debug = false; //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__ ;
/* De errors worden in het bestand opgeslagen als een array (errors[])
Als je een bestand wil maken dat al je errors toont, dan moet je je log includen
en simpelweg deze array (eerst nog declareren voor je include) aflopen in een lus */
$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.= "vraagteken>\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", "gebruikersnaam", "wachtwoord", "databasenaam");
// 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
<?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;
}
}
}
?>
/******************************************\
| Sessionhandler & Errorhandler |
\******************************************/
// ----------------------------------------------------------------------------------
// ****** Start: Functie Errorhandler *****
// ----------------------------------------------------------------------------------
function ErrorLogger($errno, $errstr, $errfile, $errline){
$bestand = "errors.php"; // Bestand waar de errors in komen
$debug = false; //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__ ;
/* De errors worden in het bestand opgeslagen als een array (errors[])
Als je een bestand wil maken dat al je errors toont, dan moet je je log includen
en simpelweg deze array (eerst nog declareren voor je include) aflopen in een lus */
$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.= "vraagteken>\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", "gebruikersnaam", "wachtwoord", "databasenaam");
// 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
<?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;
}
}
}
?>
Gewijzigd op 28/05/2010 19:35:55 door Wolf Wolf
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<?php
function open_session()
{
//Global variable to be used within all the functions.
global $db;
//Connect to the database.
if($db = mysql_connect('localhost', 'username','password'))
{
//if succeeded select the database.
mysql_select_db('database');
return true;
}
else
{
return false;
}
}
function close_session()
{
//Global variable to be used within all the functions.
global $db;
//Close the connection to the database server by setting the $db variable to NULL.
$db = NULL;
return true;
}
function read_session($session_id)
{
//Global variable to be used within all the functions.
global $db;
//Selecting the data from the database where the current session_id equals the one in the database.
$query = "SELECT
session_data
FROM
session
WHERE
session_id='".$session_id."' ";
//check if the query succeedes.
if($result = mysql_query($query))
{
//If a row meets the requirement list the data and return it.
if(mysql_num_rows($result) == 1)
{
list($data) = mysql_fetch_array($result, MYSQL_NUM);
return $data;
}
else
{
//If there is no result, send back an empty string.
return '';
}
}
else
{
//If the query fails, send back an empty string.
return '';
}
}
function write_session($session_id, $session_data)
{
//Global variable to be used within all the functions.
global $db;
//Replace the session_data with the new data.
//* Replace is a SQL function that works as an INSERT/UPDATE.
//If there is no row, create a new one, else update the current.
$query = " REPLACE INTO
session
(
session_id,
session_data,
session_garbage
)
VALUES
(
'".$session_id."' ,
'".$session_data."',
CURRENT_TIMESTAMP)";
if(mysql_query($query))
{
//if the query succeedes return the affected rows (should allways be 1).
return mysql_affected_rows();
}
else
{
return false;
}
}
function destroy_session($session_id)
{
//Global variable to be used within all the functions.
global $db;
//Delete our session, this function will be called when we use session_destroy().
$query = "DELETE FROM
session
WHERE
session_id='".$session_id."'";
//If the query succeedes empty the $_SESSION array and return the affected rows.
if(mysql_query($query))
{
$_SESSION = array();
return mysql_affected_rows();
}
else
{
return false;
}
}
function clean_session($seconds)
{
//Global variable to be used within all the functions.
global $db;
//Delete items older than the amount of seconds wich is defined in the php.ini file.
//Default is after the browser is closed(0 seconds).
$query = "DELETE FROM
session
WHERE
DATE_ADD(session_garbage, INTERVAL ".$seconds." SECOND) < NOW()";
//Return the affected rows when the query succeedes.
if(mysql_query($query))
{
return mysql_affected_rows();
}
else
{
return false;
}
}
//Set our brand new sessionhandler to be used by PHP.
session_set_save_handler('open_session','close_session', 'read_session', 'write_session', 'destroy_session', 'clean_session');
//Start the session as you would normally do.
session_start();
?>
function open_session()
{
//Global variable to be used within all the functions.
global $db;
//Connect to the database.
if($db = mysql_connect('localhost', 'username','password'))
{
//if succeeded select the database.
mysql_select_db('database');
return true;
}
else
{
return false;
}
}
function close_session()
{
//Global variable to be used within all the functions.
global $db;
//Close the connection to the database server by setting the $db variable to NULL.
$db = NULL;
return true;
}
function read_session($session_id)
{
//Global variable to be used within all the functions.
global $db;
//Selecting the data from the database where the current session_id equals the one in the database.
$query = "SELECT
session_data
FROM
session
WHERE
session_id='".$session_id."' ";
//check if the query succeedes.
if($result = mysql_query($query))
{
//If a row meets the requirement list the data and return it.
if(mysql_num_rows($result) == 1)
{
list($data) = mysql_fetch_array($result, MYSQL_NUM);
return $data;
}
else
{
//If there is no result, send back an empty string.
return '';
}
}
else
{
//If the query fails, send back an empty string.
return '';
}
}
function write_session($session_id, $session_data)
{
//Global variable to be used within all the functions.
global $db;
//Replace the session_data with the new data.
//* Replace is a SQL function that works as an INSERT/UPDATE.
//If there is no row, create a new one, else update the current.
$query = " REPLACE INTO
session
(
session_id,
session_data,
session_garbage
)
VALUES
(
'".$session_id."' ,
'".$session_data."',
CURRENT_TIMESTAMP)";
if(mysql_query($query))
{
//if the query succeedes return the affected rows (should allways be 1).
return mysql_affected_rows();
}
else
{
return false;
}
}
function destroy_session($session_id)
{
//Global variable to be used within all the functions.
global $db;
//Delete our session, this function will be called when we use session_destroy().
$query = "DELETE FROM
session
WHERE
session_id='".$session_id."'";
//If the query succeedes empty the $_SESSION array and return the affected rows.
if(mysql_query($query))
{
$_SESSION = array();
return mysql_affected_rows();
}
else
{
return false;
}
}
function clean_session($seconds)
{
//Global variable to be used within all the functions.
global $db;
//Delete items older than the amount of seconds wich is defined in the php.ini file.
//Default is after the browser is closed(0 seconds).
$query = "DELETE FROM
session
WHERE
DATE_ADD(session_garbage, INTERVAL ".$seconds." SECOND) < NOW()";
//Return the affected rows when the query succeedes.
if(mysql_query($query))
{
return mysql_affected_rows();
}
else
{
return false;
}
}
//Set our brand new sessionhandler to be used by PHP.
session_set_save_handler('open_session','close_session', 'read_session', 'write_session', 'destroy_session', 'clean_session');
//Start the session as you would normally do.
session_start();
?>
Maar nu het volgende.
Iemand heeft een sessie aangemaakt.
en ik wil dat die sessie alleen bij die persoon word gelezen, en die persoon mag maar 1 sessie hebben.
En als de sessie verlopen is dan moet de sessie ongeldig zijn...
hoe doe ik dat?
Gewijzigd op 28/05/2010 21:21:19 door Mitchel V
Ik denk dat het ook beter is om bij Inserts en Updates "mysql_real_escape_string" te gebruiken.
In mijn gebruikte script zorgt de "vuilnisman" voor het verwijderen van de sessie, dus:
- Na sluiten browser -> sessie verlopen
- Opnieuw browser starten -> nieuwe sessie = opnieuw inloggen
- Na "netjes" uitloggen (afh van je logout-script) -> sessie verlopen
- Autocontrole op verlopen sessies wanneer de class Sessie wordt aangeroepen
Ik heb een rar-bestand met de scripts voor sessionhandler, errorhandler, loginscript etc... misschien heb je daar wat aan. Bron komt van e2p-site.
Ok hoe kom ik aan je rar bestand ?:)
Een veilig loginscript maken
Ik hoop dat ook jij er wat aan hebt. Je zult dan vast wel e.e.a. gaan omgooien richting OOP en dus met mysqli gaan werken. Om de bestanden te downloaden moet je daar wel eerst registreren. Ik ben hier nog niet zo lang op het forum en ken hier nog niet alle mogelijkheden, maar eventueel kun je me een PM sturen waar je het wilt ontvangen.
Ik heb even op de ep2-site gezocht voor je. Daar staat ook een duidelijk verhaal omtrent hetgeen ik je zojuist hierboven vertelde.Ik hoop dat ook jij er wat aan hebt. Je zult dan vast wel e.e.a. gaan omgooien richting OOP en dus met mysqli gaan werken. Om de bestanden te downloaden moet je daar wel eerst registreren. Ik ben hier nog niet zo lang op het forum en ken hier nog niet alle mogelijkheden, maar eventueel kun je me een PM sturen waar je het wilt ontvangen.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$i++; $errors[$i]["tijd"]="29/05/2010 - 02:04:29";
$errors[$i]["type"]="Notice";
$errors[$i]["bestand"]="/login.php";
$errors[$i]["regel"]="117";
$errors[$i]["msg"]="Undefined index: username";
$errors[$i]["ip"]="83.**.**.***";
$errors[$i]["request_uri"]="/index.php?pagina=login";
$errors[$i]["referer"]="/index.php?pagina=home";
?>
$i++; $errors[$i]["tijd"]="29/05/2010 - 02:04:29";
$errors[$i]["type"]="Notice";
$errors[$i]["bestand"]="/login.php";
$errors[$i]["regel"]="117";
$errors[$i]["msg"]="Undefined index: username";
$errors[$i]["ip"]="83.**.**.***";
$errors[$i]["request_uri"]="/index.php?pagina=login";
$errors[$i]["referer"]="/index.php?pagina=home";
?>
login.php: regel 117:
Code (php)
1
<td>Gebruikersnaam:</td><td><input type="text" name="username" value="<?= $_POST['username']?>"></td>
maar wat is er nou fout :S
regel 117:
Code (php)
1
<td>Gebruikersnaam:</td><td><input type="text" name="username" value="<?php echo $_POST['username']; ?>"></td>
wat is er dan fout?
Gewijzigd op 29/05/2010 12:46:50 door Mitchel V
Pas je wel op dat die foutafhandeling mij toelaat om PHP code uit te voeren? Ik zou zelf gemakkelijk de HTTP_REFERER header kunnen aanpassen, ervoor zorgen dat er een quote in staat. Vervolgens kan ik m'n eigen PHP code erachter zetten die dan wordt opgeslagen in je errors.php, en als ik dat bestand dan direct (of indirect, omdat je ergens include $_GET... hebt gebruikt) aanroep, wordt mijn code uitgevoerd.
edit: die error is een notice, undefined index. Je kan wel googlen wat dat precies betekent (het is zo'n beetje de meest voorkomende notice) maar het komt erop neer dat de $_POST array niet een item bevat met de index/key/naam 'username'. Met isset($_POST['username']) eerst controleren of dat item wel bestaat alvorens je hem probeert uit te lezen lost het probleem op. Of je gebruikt deze heerlijke korte functie:
Code (php)
Gewijzigd op 29/05/2010 12:59:33 door Jelmer -
hoe kan ik dat uit zetten?
hoe kan ik dat uit zetten?
sorry internet viel uit en toen ging hij weer aan..
Gewijzigd op 29/05/2010 15:26:45 door Mitchel V
Jelmer:
Even tussendoor, Wolf Wolf,
Pas je wel op dat die foutafhandeling mij toelaat om PHP code uit te voeren? Ik zou zelf gemakkelijk de HTTP_REFERER header kunnen aanpassen, ervoor zorgen dat er een quote in staat. Vervolgens kan ik m'n eigen PHP code erachter zetten die dan wordt opgeslagen in je errors.php, en als ik dat bestand dan direct (of indirect, omdat je ergens include $_GET... hebt gebruikt) aanroep, wordt mijn code uitgevoerd.
edit: die error is een notice, undefined index. Je kan wel googlen wat dat precies betekent (het is zo'n beetje de meest voorkomende notice) maar het komt erop neer dat de $_POST array niet een item bevat met de index/key/naam 'username'. Met isset($_POST['username']) eerst controleren of dat item wel bestaat alvorens je hem probeert uit te lezen lost het probleem op. Of je gebruikt deze heerlijke korte functie:
Pas je wel op dat die foutafhandeling mij toelaat om PHP code uit te voeren? Ik zou zelf gemakkelijk de HTTP_REFERER header kunnen aanpassen, ervoor zorgen dat er een quote in staat. Vervolgens kan ik m'n eigen PHP code erachter zetten die dan wordt opgeslagen in je errors.php, en als ik dat bestand dan direct (of indirect, omdat je ergens include $_GET... hebt gebruikt) aanroep, wordt mijn code uitgevoerd.
edit: die error is een notice, undefined index. Je kan wel googlen wat dat precies betekent (het is zo'n beetje de meest voorkomende notice) maar het komt erop neer dat de $_POST array niet een item bevat met de index/key/naam 'username'. Met isset($_POST['username']) eerst controleren of dat item wel bestaat alvorens je hem probeert uit te lezen lost het probleem op. Of je gebruikt deze heerlijke korte functie:
Hoi Jelmer,
Was voor Mitch meer dat zijn code niet juist stond. Ik gebruik zelf in een dergelijke form (met voorgedefinieerde waarde):
Fouten worden bij mij niet weergegeven ivm $debug=false en mijn errors.php begint met:
Daarnaast kun je het errors bestand op een plek plaatsen met de rechten zoals je die zelf wilt hebben.
Is dat niet goed dan?
Gewijzigd op 29/05/2010 16:58:40 door Wolf Wolf
ik wil dat hij alleen met mijn sessies mag bemoeien..
Maar ben je al wat wijzer geworden met je melding. Je wilt namelijk een echo geven van iets dat niet bestaat cq waaraan niets is toegekend.
Zie ook Jelmer zijn reactie.
Gewijzigd op 29/05/2010 17:37:31 door Wolf Wolf
maar hoe kan ik verzorgen dat hij niet meer dat controleert?
variabele controleren met isset
of
functie zoals beschreven
Lees het stukje van Jelmer nog eens goed door ;-)
Een andere mogelijkheid is bijv een init bestand includen (met vooraf gedeclareerde standaard waarden) waarin je bijv het volgende hebt staan:
$_SESSION['frmField01'] = "";
Wanneer je een post ontvangt (praat ik even niet over escape-string etc...) en deze post-waarde ($_POST['username']) toekent aan bv. $_SESSION['frmField01'] en wilt de postwaarde nog ergens laten zien o.i.d. dan gebruik je echo $_SESSION['frmField01'] in je "value"-gedeelte
Je krijgt geen foutmelding in het formulier waar nog niets is ingevuld aangezien hier dan immers echo $_SESSION['frmField01'] staat en deze variabele reeds is gedeclareerd.
Ik wil alleen maar aangeven dat er dus verschillende mogelijkheden zijn. Aan jou de keuze.
Gewijzigd op 29/05/2010 19:27:45 door Wolf Wolf
Ik wil dat deze functie uit gaat..
maar hoe?
In je class doe je dan bijv:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$result = $this->db->query('INSERT INTO..');
if($this->db->affectedRows() == 0){
throw new SessionException('Kan sessie niet schrijven');
}
//en dan op je pagina
try{
$_SESSION['test'] = 1;
}catch(SessionException $e){
//Doe iets met je error.
}
?>
$result = $this->db->query('INSERT INTO..');
if($this->db->affectedRows() == 0){
throw new SessionException('Kan sessie niet schrijven');
}
//en dan op je pagina
try{
$_SESSION['test'] = 1;
}catch(SessionException $e){
//Doe iets met je error.
}
?>
Mitchel V op 30/05/2010 01:17:08:
Mijn keuze is gemaakt.
Ik wil dat deze functie uit gaat..
maar hoe?
Ik wil dat deze functie uit gaat..
maar hoe?
Waarom wil je een errorhandler uitzetten (zeker bij testen handig, lijkt me).
Wil je dan dat er errors in je scripting blijven? In dit geval is het een fout die je zelf schrijft en de errorhandler doet gewoon zijn werk.
Als je het toch persé wilt kun je de set_error_handler("ErrorLogger"); uitzetten in de handler.inc (of hele functie weggooien). De gebruikelijke errorhandler is dan weer van kracht.
Gewijzigd op 31/05/2010 12:56:09 door Wolf Wolf