php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 19-02-2008, 14:55
vls2k
 Newbie
Links : Onlinestatus : vls2k ist offline
Registriert seit: Oct 2007
Beiträge: 11
vls2k ist zur Zeit noch ein unbeschriebenes Blatt
Standard Session-Handler Entwurf

Hallo!

Ich arbeite zur Zeit an einem Session-Handler und würde gerne mal zu diesem Entwurf einige Meinungen hören bzgl. Funktionalität / Sicherheit:

PHP-Code:
<?php
final class session
{
    
# Initialisierungsfunktion, muss manuell aufgerufen werden
    
static public function loadsessionmanager()
    {
        
# Achtung bei session.auto_start!
        
ini_set('session.gc_probability'1);
        
ini_set('session.gc_divisor'50);
        
ini_set('session.save_handler''user');
        
ini_set('session.gc_maxlifetime'3600 24 8);
        
ini_set('session.cookie_lifetime'3600 24 7);

        
session_set_save_handler(array("session""on_session_start"), array("session""on_session_end"),
            array(
"session""on_session_read"), array("session""on_session_write"),
            array(
"session""on_session_destroy"), array("session""on_session_gc"));
        
        
session_start();
        
        
session_regenerate_id(false);
        return;
    }

    static public function 
on_session_start()
    {
        return 
true;
    }

    static public function 
on_session_end()
    {
        return 
true;
    }

    static public function 
on_session_read($key)
    {
        
$res DB::query('SELECT session_data FROM sessions WHERE session_id = "' mysql_real_escape_string($key) . '";');
        
$obj mysql_fetch_object($res);
        return (
$obj->session_data);
    }

    static public function 
on_session_write($key$val)
    {
        
# Session Fixation vermeiden, eine Session-ID ist nur eine Woche
                # gültig, dieser Gültigkeitszeitraum wird nicht aktualisiert!
                # Da dann bereits eine neue ID erstellt wurde
        
$query 'INSERT INTO sessions (session_id, session_data, session_time) VALUES ('
                    
'"' .  mysql_real_escape_string($key) . '",'
                    
'"' .  mysql_real_escape_string($val) . '",'
                    
'UNIX_TIMESTAMP() ) '
                    
'ON DUPLICATE KEY UPDATE '
                    
'session_data="' .  mysql_real_escape_string($val) . '";';
        
mysql_query($query);
        return 
true;
    }

    static public function 
on_session_destroy($key)
    {
        return 
DB::query('DELETE FROM sessions WHERE session_id="'.$key.'"');
    }

    static public function 
on_session_gc($max_lifetime)
    {
        
DB::query('DELETE FROM sessions WHERE session_time + "' mysql_real_escape_string($max_lifetime) . '" < UNIX_TIMESTAMP()');
        return 
true;
    }
}
?>

Code:
# SQL-DUMP:
CREATE TABLE `sessions` (
  `session_id` char(32) collate latin1_general_ci NOT NULL,
  `session_data` text collate latin1_general_ci NOT NULL,
  `session_time` int(10) NOT NULL default '0',
  PRIMARY KEY  (`session_id`),
  KEY `t_stamp` (`session_time`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Danke!

Geändert von vls2k (20-02-2008 um 00:20 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 19-02-2008, 22:47
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

  1. Das on_session_ bei den Funktionsnamen weg!
  2. Eine Instanz anstatt statischer Methoden
  3. Ini-Werte nicht überschreiben, oder zumindest nicht statisch!
Was mir so spontan dazu einfällt!
Mit Zitat antworten
  #3 (permalink)  
Alt 19-02-2008, 22:54
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

1. umbrüche in den code einbinden!
2. statt INSERT ... ON DUPLICATE ... lieber auf REPLACE zurück greifen.
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #4 (permalink)  
Alt 19-02-2008, 23:30
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich würde der Klasse noch die Möglichkeit geben, ein Konfigurations-Array entgegen zu nehmen, damit du Änderungen an den relevanten Session Ini-Einträgen komfortabel vornehmen kannst, statt die Klasse editieren zu müssen.

Z.B.
PHP-Code:
class SessionSaveHandler
{
    private 
$_options = array(
        
'gc_probability' => null,
        
'gc_divisor'     => null,
        
'gc_maxlifetime' => null,
        
// ...
    
);

    public function 
__construct(array $options = array())
    {
        foreach (
$options as $option => $value)
        {
            if (
array_key_exists($option$this->_options))
            {
                
ini_set('session_' $option$value);
            }
        }
    }

Nur mal als kleine Anregung.
Mit Zitat antworten
  #5 (permalink)  
Alt 19-02-2008, 23:42
bla$ter
 Newbie
Links : Onlinestatus : bla$ter ist offline
Registriert seit: Oct 2003
Beiträge: 84
bla$ter ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hmm, sieht mit nicht besonders race safe aus, ich würde dringend den Einsatz von "SELECT ... FOR UPDATE" oder "SELECT GET_LOCK" empfehlen, um Dateninkonsistenz zu vermeiden.
Mit Zitat antworten
  #6 (permalink)  
Alt 20-02-2008, 00:23
vls2k
 Newbie
Links : Onlinestatus : vls2k ist offline
Registriert seit: Oct 2007
Beiträge: 11
vls2k ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Abraxax
1. umbrüche in den code einbinden!
2. statt INSERT ... ON DUPLICATE ... lieber auf REPLACE zurück greifen.
zu 1.: done ;-)
zu 2.: dann ist der effekt aber weg, dass eine session sich nicht mehr verlängern lässt... bei REPLACE würde ja auch die time neu gesetzt werden...


Zitat:
Original geschrieben von bla$ter
Hmm, sieht mit nicht besonders race safe aus, ich würde dringend den Einsatz von "SELECT ... FOR UPDATE" oder "SELECT GET_LOCK" empfehlen, um Dateninkonsistenz zu vermeiden.
An welcher Stelle denn? Die Write-Funktion wird ja erst am Ende des Skriptes aufgerufen, so lange kann ich doch nicht alle anderen Prozesse warten lassen?
Mit Zitat antworten
  #7 (permalink)  
Alt 20-02-2008, 00:36
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von vls2k
zu 1.: done ;-)
zu 2.: dann ist der effekt aber weg, dass eine session sich nicht mehr verlängern lässt... bei REPLACE würde ja auch die time neu gesetzt werden...
1. da sind aber noch mindestens 3 zeilen recht lang ... aber schon deutlich besser als vorher ...

2. du willst doch bestimmt eh eine anzeige ala letzte aktivität haben. oder?

und das db-feld würde ich auf TIMESTAMP definieren und mich bei der query nicht mehr drum kümmern.
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #8 (permalink)  
Alt 20-02-2008, 00:41
vls2k
 Newbie
Links : Onlinestatus : vls2k ist offline
Registriert seit: Oct 2007
Beiträge: 11
vls2k ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Abraxax
1. da sind aber noch mindestens 3 zeilen recht lang ... aber schon deutlich besser als vorher ...

2. du willst doch bestimmt eh eine anzeige ala letzte aktivität haben. oder?

und das db-feld würde ich auf TIMESTAMP definieren und mich bei der query nicht mehr drum kümmern.
zu 2. Nein, der Session-Handler ist für ein Communityähnliches System... Da z.B. ein mit PHPSESSID geposteter Link (bei deaktivierten Cookies) die Übernahme der Session ermöglichen würde, suche ich nach möglichkeiten, den Schaden zu begrenzen, indem nach Session-ID-Wechsel bei einem Aufruf die alte ID icht mehr refreshbar ist. Was gibt es noch für weitere möglichkeiten? (außer IP) Nur auf Cookies setzen?
Mit Zitat antworten
  #9 (permalink)  
Alt 20-02-2008, 00:57
bla$ter
 Newbie
Links : Onlinestatus : bla$ter ist offline
Registriert seit: Oct 2003
Beiträge: 84
bla$ter ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von vls2k

An welcher Stelle denn? Die Write-Funktion wird ja erst am Ende des Skriptes aufgerufen, so lange kann ich doch nicht alle anderen Prozesse warten lassen?
Aus diesem Grund sollst du ja row level locks verwenden, die beeinträchtigen andere Prozesse auf anderen Sessions nicht im geringsten. PHP macht das nicht anders, der default session handler legt ein exlock auf das session file und behält das so lange bei, bis das Script beendet wird.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:45 Uhr.