-
Security (2)
-
Linux-Security (10)
-
Firewalls (3)
-
Cryptography (2)
-
Firewalls (3)
- Windows-Security (2)
-
Cryptology (1)
-
Programmierung (1)
-
PHP (2)
-
PHP (2)
-
Linux-Security (10)
-
Be-paranoid.net (-2)
- Viren & Würmer (2)
- Hints (1)
- Buchtipps (1)
- Offtopic (7)
- Programmieren (5)
- Honeypots (1)
- Linux Security (2)
- Cryptology (1)
- Datenschutz (3)
- Viren & Würmer (2)
Hexblog
SEppl's Blog
Rabenhorst
The Daily WTF
Otrn Blog
Userfriendly
Schneier on Security
Planet SELinux & News
Heise
SecurityFocus
Open4Free Blog
xkcd
|_|_|0|
|0|0|0|
Be-Paranoid.net
Sessionverwaltung über MySQL
Orginal Version | Artikel editieren | Versionen anzeigen | Bottom
Letzte Änderung: 16.03.2010, 13:21
Inhaltsverzeichnis
Code Top
Der folgende Code verlagert die Session-Verwaltung von PHP in eine MySQL-Datenbank. Bei der Implementierung wurde besonders auf Sicherheit geachtet.
Code:
$salt = 'salzig';
ini_set('session.use_only_cookies', '1');
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
function _open() {
global $conn;
global $salt;
if ( ($conn = mysql_connect($mysql_host, $mysql_user, $mysql_passwort)) && mysql_select_db($mysql_datenbank, $conn) ) {
if ( $id = session_id() ) {
$id = mysql_real_escape_string($id, $conn);
$ipagent = '';
if ( mysql_num_rows( $query = mysql_query("SELECT `ipagent` FROM `user_sessions` WHERE `id` = '{$id}'", $conn) ) )
$ipagent = mysql_result($query,0);
if ( $ipagent != md5($salt.$_SERVER['HTTP_USER_AGENT']) )
session_regenerate_id();
}
}
else
return FALSE;
}
function _close() {
global $conn;
return mysql_close($conn);
}
function _read($id) {
global $conn;
$id = mysql_real_escape_string($id, $conn);
if ( mysql_num_rows( $query = mysql_query("SELECT `data` FROM `user_sessions` WHERE `id` = '{$id}'", $conn)) )
return mysql_result($query, 0);
return '';
}
function _write($id, $data) {
global $conn;
global $salt;
$access = mysql_real_escape_string(time(), $conn);
$id = mysql_real_escape_string($id, $conn);
$data = mysql_real_escape_string($data, $conn);
$ipagent = mysql_real_escape_string(md5($salt.$_SERVER['HTTP_USER_AGENT']), $conn);
return mysql_query("REPLACE INTO `user_sessions` (`id`,`access`,`data`,`ipagent`) VALUES ('{$id}','{$access}','{$data}','{$ipagent}')", $conn);
}
function _destroy($id) {
global $conn;
$id = mysql_real_escape_string($id, $conn);
return mysql_query("DELETE FROM `user_sessions` WHERE `id` = '{$id}'", $conn);
}
function _clean($max) {
global $conn;
$max = mysql_real_escape_string(time() - $max, $conn);
return mysql_query("DELETE FROM `user_sessions` WHERE `access` < '{$max}'", $conn);
}
Weiters ist dazu eine Tabelle mit folgender Struktur erforderlich
MySQL-DB:
CREATE TABLE `user_sessions` (
`id` varchar(32) NOT NULL default '',
`access` int(10) unsigned default NULL,
`data` text default NULL,
`ipagent` varchar(32) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM;
bzw. für Tabellen im RAM (schneller, funktioniert jedoch erst ab MySQL 5.0.3):
MySQL-DB:
CREATE TABLE `user_sessions` (
`id` varchar(32) NOT NULL default '',
`access` int(10) unsigned default NULL,
`data` varchar(1024) default NULL,
`ipagent` varchar(32) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MEMORY;
Für die Spalte data kann dabei ein Varchar mit bis zu 65.535 Zeichen verwendet werden.
Optimierung Top
Die Funktion _clean() kann dabei auch dazu genutzt werden, um alte User-Accounts aufzuräumen. Sie wird bei PHP ungefähr alle 100 Seitenaufrufe einmal ausgeführt und eignet sich daher besonders für Aktionen, welche zwar gelegentlich, aber nicht immer erledigt werden müssen.
Wie oft _clean ausgeführt wird, kann über ini_set(session.gc_probability, WERT); und ini_set(session.gc_divisor, WERT); eingestellt werden. Dabei gilt:
probability/divisor = Wahrscheinlichkeit der Ausführung in %.
Weblinks Top
Edit Top
Die IP adresse sollte nicht mehr zum indentifizieren benutzt werden.
Heutzutage surfen viele über prox server, welche die IP teilweise sogar pro request ändern. Solche sowie auch zB ADSL user schließt man damit aus seinem Angebot aus.
Achtung! Top
Auf dieser Seite wird davor gewarnt den session_set_save_handler zu benutzen. UNBEDINGT DURCHLESEN!!!
Evtl. kann hier jemand eine Lösung posten.
Orginal Version | Artikel editieren | Versionen anzeigen | Top
Letzte Änderung: 16.03.2010, 13:21