php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Thema geschlossen
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.12.2011, 19:13  
archer42
Gast
 
Beiträge: n/a
Standard Session OOP

Hallo,

Ich benötige noch etwas Hilfe bei der Verbesserung meines Sessions Management Systems.

1. Was habe ich "ungünstig" gelöst?
2. Die Prüfung auf valide Authentifizierung schlägt immer fehl

index.php
PHP-Code:
<?php

include('config.inc.php');
include(
'class.inc.php');

$auth = new auth();

if(
$_POST['logout']) {
    
$auth->logout();
}

if(!
$auth->check()) {
    include(
'login.php');
} elseif (
$auth->check()) {
    include(
'secret.tpl');
}    

?>
login.php
PHP-Code:
<?php

if($auth->valid($_POST['user'], $_POST['pass'])) {
    if(
$auth->auth()) {
        exit();
    } else {
        
$output 'Fehler bei Authentifizierung';
    }
}

include(
'login.tpl');
?>
class.inc.php
PHP-Code:
<?php

class auth {
    private 
$user;
    private 
$pass;
    private 
$hash;
    
    private 
$key_1;
    private 
$key_2;
    

    public function 
check() {
        
session_start();
        if( (!
$_SESSION['state']) || ($_SESSION['one'] != $this->key_1) || ($_SESSION['two'] != $this->key_2) ) {
            return 
FALSE;
            exit();
        } else {
            return 
TRUE;
        }
    }
    
    private function 
key() {
        
$rand  hash('SHA512'rand());
        
$str   str_split($rand32);
        
$this->key_1 $str[0].date('m.d.Y H:i:s').$str[1];
        
$this->key_2 $str[2].$_SERVER['HTTP_USER_AGENT'].$str[3];
    }

    public function 
valid($username$password) {
        
$_SESSION['state'] = FALSE;
        if(
trim($username) != '' && trim($password) != '') {
            
$this->user $username;
            
$this->pass $password;
            
$this->hash hash('SHA512'$this->pass);
            return 
TRUE;
        } else {
            return 
FALSE;
        }
    }
    
    public function 
auth() {
        
$db = new mysqli(HOSTUSERPASSDATA);
        if(
$stmt $db->prepare('SELECT user, hash, status FROM user WHERE user = ? AND hash = ? AND status = 1')) {
            
$stmt->bind_param('ss'$this->user$this->hash);
            
$stmt->execute();
            
$stmt->store_result();
            
$state $stmt->num_rows();
            
$stmt->close();
        }
        if(
$state == 1) {
            
$this->key();
            
$_SESSION['state'] = TRUE;
            
$_SESSION['time']  = date('m.d.Y H:i:s');
            
$_SESSION['one']   = $this->key_1;
            
$_SESSION['two']   = $this->key_2;
            return 
TRUE;
        } else {
            return 
FALSE;
        }
    }
    
    public function 
logout() {
        
session_destroy();
        
session_unset();
        
header('Location: login.php');
    }
}            
    
?>
Gruß archer42
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.12.2011, 19:52  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

In deinem Check greifst du auf $this->key_1 zu - das wird aber nirgends gesetzt (außer im Auth) - da ist es kein Wunder, dass dein Check fehl schlägt.
Insgesamt erschließt sich mir nicht ganz, wozu du valid() und auth() benötigst - auth() ist auch ohne valid() aufrufbar und somit potentiell fehleranfällig, fasse es in einer Methode zusammen.
Und das ganze key_*-Zeug wirfst gleich mit raus, mit rand()-Werten hast du nie zwei gleiche Werte, womit der Vergleich hinfällig ist.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline  
Alt 09.12.2011, 20:55  
archer42
Gast
 
Beiträge: n/a
Standard

Danke für die schnelle Antwort
Zitat:
In deinem Check greifst du auf $this->key_1 zu - das wird aber nirgends gesetzt (außer im Auth) - da ist es kein Wunder, dass dein Check fehl schlägt
Dachte das wird in der Klasse gespeichert, sodass ich da wieder zurückgreifen kann, dachte aber anscheinend falsch.
Zitat:
Insgesamt erschließt sich mir nicht ganz, wozu du valid() und auth() benötigst - auth() ist auch ohne valid() aufrufbar und somit potentiell fehleranfällig, fasse es in einer Methode zusammen.
Um es etwas übersichtlicher zu halten habe ich die Methode als private deklariert und in auth() eingebunden.

Was mir dazu noch eingefallen ist, dass key_1 ungültig ist, da sich die Zeit ändern.
Soll ich dafür die Zeit in einer anderen Variable zwischenspeichern oder soll ich das ganz weglassen?
 
Alt 09.12.2011, 20:56  
archer42
Gast
 
Beiträge: n/a
Standard

index.php
PHP-Code:
<?php

include('config.inc.php');
include(
'class.inc.php');

$auth = new auth();

if(
$_POST['logout']) {
    
$auth->logout();
}

if(!
$auth->check()) {
    include(
'login.php');
} elseif (
$auth->check()) {
    include(
'secret.tpl');
}    

?>
class.inc.php
PHP-Code:
<?php

class auth {
    private 
$user;
    private 
$pass;
    private 
$hash;
    
    private 
$key_1;
    private 
$key_2;
    

    public function 
check() {
        
session_start();
        if( (!
$_SESSION['state']) || ($_SESSION['one'] != $this->key_1) || ($_SESSION['two'] != $this->key_2) ) {
            return 
FALSE;
            exit();
        } else {
            return 
TRUE;
        }
    }
    
    private function 
key() {
        
$rand  hash('SHA512''?PH6gzUrt#*');
        
$str   str_split($rand32);
        
$this->key_1 $str[0].date('m.d.Y H:i:s').$str[1];
        
$this->key_2 $str[2].$_SERVER['HTTP_USER_AGENT'].$str[3];
    }

    private function 
valid() {
        
$_SESSION['state'] = FALSE;
        if(
trim($_POST['user']) != '' && trim($_POST['pass']) != '') {
            
$this->user $_POST['user'];
            
$this->pass $_POST['pass'];
            
$this->hash hash('SHA512'$this->pass);
            return 
TRUE;
        } else {
            return 
FALSE;
        }
    }
    
    public function 
auth() {
        if(
$this->valid()) {
            
$db = new mysqli(HOSTUSERPASSDATA);
            if(
$stmt $db->prepare('SELECT user, hash, status FROM user WHERE user = ? AND hash = ? AND status = 1')) {
                
$stmt->bind_param('ss'$this->user$this->hash);
                
$stmt->execute();
                
$stmt->store_result();
                
$state $stmt->num_rows();
                
$stmt->close();
            }
            if(
$state == 1) {
                
$this->key();
                
$_SESSION['state'] = TRUE;
                
$_SESSION['time']  = date('m.d.Y H:i:s');
                
$_SESSION['one']   = $this->key_1;
                
$_SESSION['two']   = $this->key_2;
                return 
TRUE;
            } else {
                return 
FALSE;
            }
        } else {
            return 
FALSE;
        }
    }
    
    public function 
logout() {
        
session_destroy();
        
session_unset();
        
header('Location: login.php');
    }
}            
    
?>
 
Alt 09.12.2011, 21:01  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von archer42 Beitrag anzeigen
Dachte das wird in der Klasse gespeichert, sodass ich da wieder zurückgreifen kann, dachte aber anscheinend falsch.
Dann bräuchtest du keine Sessions, wenn das so wäre.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline  
Alt 09.12.2011, 21:08  
archer42
Gast
 
Beiträge: n/a
Standard

Was ist mit dem Zeit-Key?
Soll ich das so machen:
PHP-Code:
    private function key() {
        
$rand  hash('SHA512''?PH6gzUrt#*');
        
$str   str_split($rand32);
        
$_SESSION['date'] = date('m.d.Y H:i:s');
        
$this->key_1 $str[0].$_SESSION['date'].$str[1];
        
$this->key_2 $str[2].$_SERVER['HTTP_USER_AGENT'].$str[3];
    } 
 
Alt 09.12.2011, 22:01  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Error_reporting erstmal voll aufdrehen, dann dürfte es schonmal Warnungen und Fehler hageln.

Was noch auffällt:
Der Code startet mit der Erstellung einer auth Instanz und dem Aufruf der auth() Funktion, welche wiederum $this->valid() aufruft, welche wiederum auf eine Session zugreifen möchte, die es zu diesem Zeitpunkt noch gar nicht gibt!
Aus unerfindlichen Gründen wird die Session nämlich erst in der check() Methode gestartet (besser wäre im Konstruktor der auth Klasse)

Dann...
Zitat:
PHP-Code:
if(!$auth->check()) {
    include(
'login.php');
} elseif (
$auth->check()) {
    include(
'secret.tpl');

Das ist doppelt gemoppelter Unsinn. Der zweite check() Aufruf ist zuviel, das wird bereits durch den else-Zweig des if abgedeckt (dazu gibt es ja else überhaupt nur - wenn eine Bedingung nicht zutrifft, muss zwangsläufig das Gegenteil zutreffen).
Ausserdem versuchst du, eine Datei mit der Endung .tpl zu inkludieren (vermutlich ein Smarty Template?). Die Endung .tpl wird weder vom PHP Parser verarbeitet, noch wird eine eventuell enthaltene Metasprache (Smarty) geparsed, das dürfte zu Anzeigefehlern führen.
PHP-Code:
if ($auth->check()) {
  
$smarty_or_other_template_engine->render('secret.tpl');
}
else {
  include(
'login.php');

__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline  
Alt 09.12.2011, 22:18  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von lstegelitz Beitrag anzeigen
Ausserdem versuchst du, eine Datei mit der Endung .tpl zu inkludieren (vermutlich ein Smarty Template?). Die Endung .tpl wird weder vom PHP Parser verarbeitet, noch wird eine eventuell enthaltene Metasprache (Smarty) geparsed, das dürfte zu Anzeigefehlern führen.
Sagt wer?
Bei einem Direkt-Aufruf magst du recht haben, bei einem Include nicht.

index.php
PHP-Code:
<?php

include './foo.tpl';


?>
foo.tpl
PHP-Code:
<?php

echo 'Hello world: '.date('d.m.Y H:i:s');

?>
Code:
Hello world: 09.12.2011 22:17:09
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline  
Alt 09.12.2011, 22:29  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Stimmt auffallend...
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline  
Alt 09.12.2011, 23:17  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Du kannst auch ne .exe inkludieren, wenn es Dir Spaß macht. include/require ist nichts als stupide Code-Ersetzung.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Thema geschlossen


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Fragen zu Login und Session (geschützter Bereich) ts.ts PHP Einsteiger 12 14.10.2011 17:36
Session sicherheit mit IP Adresse??? Sven1987h PHP Einsteiger 9 11.10.2011 11:37
Session GC und Timeout nutcracker PHP Einsteiger 1 24.01.2011 19:32
[Erledigt] $_SESSION frage tomnar PHP Tipps 2010 24 09.11.2010 19:37
session variable verschwindet bei erneutem seitenaufruf david.a.p. PHP Tipps 2009 2 17.08.2009 16:07
SessionHandler - Sessions in einer Datenbank #Avedo Software-Design 11 04.05.2009 15:44
[Erledigt] Problem mit der übergabe einer Session ID Shinak PHP Tipps 2009 12 13.03.2009 14:30
Session nofear87 PHP Tipps 2008 8 05.11.2008 10:42
[Erledigt] Session Problem karina_02 PHP Tipps 2008 6 18.05.2008 22:37
Problem bei session Lifetime Cyberbob_at_tot PHP Tipps 2007 5 05.06.2007 17:47
session nach seitenwechsel leer... GELight PHP Tipps 2006 8 17.09.2006 15:17
[Erledigt] php session problem :( PHP Tipps 2005-2 5 21.10.2005 16:37
Session wird nicht angelegt PHP Tipps 2005-2 7 24.07.2005 13:35
Kreieren einer Session PHP Tipps 2005 11 28.05.2005 15:16
[Erledigt] Formulardaten in einer Session speichern, per Link übergeben PHP Tipps 2004-2 2 29.12.2004 15:47

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
// erzeugen einer instanz > $user = new user(); > > // speichern dieser instanz in einer session > $_session[\'user\'] = $user;, smarty session oop, php oop seitenwechsel, php oop session handling, public function check session(), php oo session, php:auth-klasse erstellen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:46 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum