php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.04.2006, 19:28  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard problem bei sessions in komb. m. cookies. header umgehen?

bisher habe ich in meiner admin.php nur einloggen in kombination mit sessions.
jetzt wollte ich das erweitern mit cookie, sprich remember logindata.
jedoch stehe ich jetzt vor einem unlösbaren problem.

es stellt sich wiefolgt dar: am anfang der admin.php ist die abfrage ob die sessiondaten für den admin passen.
wenn dies der fall ist, wird die jeweilige seite, falls diese existiert in die admin includet, sonst die login.php, welche bei erfolgreichem login
die $_SESSION['username'] erzeugt.

das funktioniert bisher alles super:
PHP-Code:
session_start();
$SID session_id();

if(isset(
$_GET['logout'])) {
  unset(
$_SESSION['username']);
}

if(!isset(
$_SESSION['username'])) {
  
$_SESSION['cont'] = 'login';
} else {
  if(isset(
$_GET['cont']) && !empty($_GET['cont']) && file_exists(DIR_WS_ADMIN.$_GET['cont'].'.php')) {
    
$_SESSION['cont'] = $_GET['cont'];
  }
  elseif(!isset(
$_GET['cont']) || empty($_GET['cont'])) {
    
$_SESSION['cont'] = 'start';
  } else {
    
$_SESSION['cont'] = 'start';
  }

die erweiterung für cookies, sprich die cookie abfrage wäre jetzt ja ganz einfach:
PHP-Code:
session_start();
$SID session_id();

// cookie auf vorhandensein prüfen, wenn alles passt daten in session schreiben.
// natürlich dann noch mit sicherheitsüberprüfung. ;o)
if(isset($_COOKIE['username'])) {
  
$_SESSION['username'] = $_COOKIE['username'];
}

if(isset(
$_GET['logout'])) {
  unset(
$_SESSION['username']);
}

if(!isset(
$_SESSION['username'])) {
  
$_SESSION['cont'] = 'login';
} else {
  if(isset(
$_GET['cont']) && !empty($_GET['cont']) && file_exists(DIR_WS_ADMIN.$_GET['cont'].'.php')) {
    
$_SESSION['cont'] = $_GET['cont'];
  }
  elseif(!isset(
$_GET['cont']) || empty($_GET['cont'])) {
    
$_SESSION['cont'] = 'start';
  } else {
    
$_SESSION['cont'] = 'start';
  }

aber wie kann ich das cookie setzen? ich habe jetzt ja die login.php.
wenn der username und passwort mit dem formular abgeschickt wird,
werden die daten mit der datenbank verglichen und wenn alles passt wird die variable $_SESSION['username'] gefüllt.

ABER... wenn ich im formular jetzt auch noch via input type = "checkbox" eine variable für cookie ja oder nein übergebe,
dann habe ich das problem: WIE setze ich das cookie?
denn mitten im code geht das ja nicht, sondern über nur über den header.

habt ihr eine idee wie ich das lösen könnte?

eine idee wäre gewesen: die login.php überprüft ja alles und wenn alles ok ist wird mit einem meta refresh die seite neu geladen.
ich könnte dann ja eine variable übergeben die mir auf der admin.php ganz am anfang das cookie setzt,
allerdings wäre das mit einem sicherheitsrisiko verbunden,
denn ich müsste den usernamen und diese variable mit GET übergeben oder?:
PHP-Code:
session_start();
$SID session_id();

if(isset(
$_GET['meta_refresh_set_cookie'])) {
  
setcookie('username'$_GET['username']);
}

if(isset(
$_GET['logout'])) {
  unset(
$_SESSION['username']);
}

if(!isset(
$_SESSION['username'])) {
  
$_SESSION['cont'] = 'login';
} else {
  if(isset(
$_GET['cont']) && !empty($_GET['cont']) && file_exists(DIR_WS_ADMIN.$_GET['cont'].'.php')) {
    
$_SESSION['cont'] = $_GET['cont'];
  }
  elseif(!isset(
$_GET['cont']) || empty($_GET['cont'])) {
    
$_SESSION['cont'] = 'start';
  } else {
    
$_SESSION['cont'] = 'start';
  }

ps: eine kleine frage noch: warum werden hier, wenn man den code [ php] verwendet die zeilen nicht mehr umgebrochen
und der horizontale scrollbalken erscheint?
ist das ein mozilla problem oder auch mit dem internet explorer der fall?
__________________
mfg Alexander Haim
Promaetheus ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 30.04.2006, 19:58  
Gast
 
Beiträge: n/a
Standard

Kannst Du bitte mal in eigenen Worten (ohne Code) aber Schritt für Schritt beschreiben, was Du vorhast?

Beim Überfliegen des Textes kam es mir so vor, dass es reicht ein Cookie mit dem Usernamen anzulegen, um angemeldet zu sein. Jedenfalls deutet
Code:
if(isset($_GET['logout'])) {
  unset($_SESSION['username']);
}
darauf hin, dass $_SESSION['username'] der entscheidene Bestandteil von $_SESSION ist. Kann aber wiederum nicht sein, da der Benutzer das ohne weitere Kontrolle selbst setzen kann
Code:
if(isset($_COOKIE['username'])) {
  $_SESSION['username'] = $_COOKIE['username'];
}
Code:
f(isset($_GET['meta_refresh_set_cookie'])) {
  setcookie('username', $_GET['username']);
}
Und da muss ich was falsch verstanden haben
 
Alt 02.05.2006, 10:45  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

hallo bruchpilot. hier nun die schilderung meines falles in meinen eigenen worten:

ich habe eine admin.php. in dieser wird am anfang des codes geprüft ob eine $_SESSION['username'] besteht. falls diese besteht wird ein bestimmter content inkludiert, sprich eine bestimmte seite. falls diese seite nicht besteht wird eine definierte startseite angezeigt. falls jedoch die $_SESSION['username'] nicht besteht wird eine login.php inkludiert. also ein einfachstes cms.

in der login.php wird ganz normal ein formular mit username und passwort angezeigt. bei absenden des passwortes und username wird dies in der datenbank überprüft. bei erfolg wird eine $_SESSION['username'] gesetzt.

also alles ganz einfach.

wenn ich jetzt allerdings ein cookie setzen will habe ich ein problem. denn setcookie() kann ich nicht an der stelle mitten im code machen wenn ich die $_SESSION['username'] setze.

ich habe das jetzt so gelöst dass ich, falls in dem formular noch das häkchen "eingloggt bleiben" aktiviert war, nach dem setzen der $_SESSION['username'] noch eine $_SESSION['remember_login'] mit wert 1 setze.

dann habe ich in der admin.php ganz oben gleich unter session_start() eine abfrage gemacht, dass wenn $_SESSION['remember_login'] == 1 er ein cookie mit usernamen und md5 verschlüsseltem passwort setzen soll.

mein problem bei der sache war dass er das cookie ja erst sieht wenn er die seite erneut aufruft. und ich habe bei jedem aufruf der seite eine mysql abfrage ob username und passwort des cookies mit der datenbank übereinstimmen. ich glaube das habe ich noch nicht wirklich gut gelöst. ich müsste die cookie abfrage erst machen falls die $_SESSION['username'] nicht existiert, dann würde ich mir die weiteren datenbankvergleiche des cookies bei jedem seitenaufruf sparen.

so was einfaches klingt so furchtbar kompliziert. nicht wahr?

noch zwei kleine unklarheiten:
1.) wie läuft das wenn man bsp: ein cookie mit setcookie('username', 'alex', ...) anlegt. was ist wenn eine andere seite auch so eins anlegt? oder muss man den namen einfach immer so spezifizieren dass das nicht passieren kann? denn ich muss in meinem fall ja eins mit usernamen und eins mit passwort anlegen.

2.)
Zitat:
ps: eine kleine frage noch: warum werden hier, wenn man den code [ php] verwendet die zeilen nicht mehr umgebrochen
und der horizontale scrollbalken erscheint?
ist das ein mozilla problem oder auch mit dem internet explorer der fall
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 02.05.2006, 12:26  
Gast
 
Beiträge: n/a
Standard

Zitat:
denn setcookie() kann ich nicht an der stelle mitten im code machen wenn ich die $_SESSION['username'] setze.
Aber ja doch, das geht.
session_start() setzt auch nur einen cookie (wenn php so eingestellt ist. Per default ist es so).
setcookie() kann nur nicht mehr erfolgreich aufgerufen werden, wenn Ausgaben an den Browser gesendet wurden. Aber das ist unabhängig von session_start() immer so.

Und dem Benutzer ohne weitere Authorisierung erlauben, den Benuzernamen in der session festzulegen, muss einfach falsch sein.
Allerspätestens bei
Code:
if(isset($_GET['meta_refresh_set_cookie'])) {
  setcookie('username', $_GET['username']);
}
müssen sich doch einem die Nackenhaare aufstellen. Ich sehe da jedenfalls keinen weiteren Test, bevor das da ausgeführt wird.
 
Alt 02.05.2006, 12:31  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

ja das ist mir schon klar. ich hatte das ja nurmal schnell zum testen geschrieben ob das cookie da ist (auf meinem localhost). natürlich werde ich dann noch eine db abfrage machen und den usernamen im cookie mit dem ebenfalls in einem cookie gespeicherten passwort mit der db zu verlgeichen. dass passwortcookie werde ich md5 verschlüsseln. kannst du mir einen tipp geben wie ich das machen soll damit nicht eine andere seite auch ein cookie mit dem namen hat? bsp. domain.com.username oder so?
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 02.05.2006, 13:14  
Gast
 
Beiträge: n/a
Standard

Ich verstehe noch nicht, wozu der Aufwand notwendig ist.

Geht es um das "angemeldet bleiben" über Tage oder Wochen hinweg oder um was?
 
Alt 02.05.2006, 13:24  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

genau. einfach um die funktion eingeloggt bleiben. wie hier im forum.

ich habe das jetzt so gelöst und denke dass das halbwegs sicher ist:

login.php:
formular mit folgenden variablen: username, password, remember_login

bei abschicken wird in db username auf vorhandensein geprüft, dann ob das passwort zum usernamen passt. wenn das alles passt wird der username in $_SESSION['username'] gespeichert. wenn remember_login == 1 dann wird eine $_SESSION['remember_login'] mit dem wert 1 gesetzt.

in der eigentlichen geschützten datei dann, bspw. admin.php wird als 1. die session_start() gesetzt, dann if($_SESSION['remember_login']) ein cookie 'domain_username' mit dem $_SESSION['username'] und ein cookie 'domain_password' mit md5($_SESSION['password']. danach gleich unset($_SESSION['password']).

beim überprüfen auf das cookie wird das nochmal abgefragt. so müsste es ja passen oder? hier der anfang der admin.php:

warum kann man hier den [ php] befehl nicht verwenden ohne dass die zeilen nicht mehr umgebrochen werden?

Code:
session_start();
$SID = session_id();

if(isset($_GET['logout'])) {
  unset($_SESSION['username']);
  setcookie('pd_username', '');
  setcookie('pd_password', '');
  $_SESSION['logout'] = '1';
}

if(isset($_SESSION['remember_login']) && $_SESSION['remember_login'] == '1') {
  setcookie('pd_username', $_SESSION['username'], time() + 4838400);
  setcookie('pd_password', md5($_SESSION['password']), time() + 4838400);
  unset($_SESSION['password']);
  unset($_SESSION['remember_login']);
}

if(isset($_COOKIE['pd_username']) && $_SESSION['logout'] != '1' && !isset($_SESSION['username'])) {
  $sql = 'SELECT admin_username,
                 admin_password
          FROM '.TABLE_ADMIN.'
          WHERE admin_username = \''.$_COOKIE['pd_username'].'\'';
  $query = mysql_query($sql);
  if(mysql_num_rows($query) > 0) {
    $data = mysql_fetch_array($query);
    if(md5($data['admin_password']) == $_COOKIE['pd_password']) {
      $_SESSION['username'] = $_COOKIE['pd_username'];
    }
  }
}

if(!isset($_SESSION['username']) || $_SESSION['logout'] == '1') {
  $_SESSION['cont'] = 'login';
} else {
  if(isset($_GET['cont']) && !empty($_GET['cont']) && file_exists(DIR_WS_ADMIN.$_GET['cont'].'.php')) {
    $_SESSION['cont'] = $_GET['cont'];
  }
  elseif(!isset($_GET['cont']) || empty($_GET['cont'])) {
    $_SESSION['cont'] = 'start';
  } else {
    $_SESSION['cont'] = 'start';
  }
}
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 02.05.2006, 14:19  
Gast
 
Beiträge: n/a
Standard

Ja, das sieht besser aus.
Aber so ganz erschließt sich mir der Sinn nicht (mehr).
Welcher verbreitete Browser hat denn mittlerweile keinen Form/login-Manager dabei?
 
Alt 02.05.2006, 14:43  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

also firefox und die haben den ja. aber der mistige internet explorer wohl nicht, denn bei uns im modellbauclub jammern immer alle: "kannst du nicht eine cookie funktion machen, weil immer einloggen ist so lästig".

tja... die faulheit der user.

danke nochmal für deine tipps. so sicher wie möglich habe ich es jetzt eh gemacht oder? wie ich noch mehr sicherheit zustandebringe fällt mir jetzt nicht ein.
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 02.05.2006, 15:30  
Gast
 
Beiträge: n/a
Standard

Dann haben sie wohl die Option dafür im IE abgeschaltet.
 
 


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
Sessions Problem StephenKing PHP Tipps 2008 3 16.10.2007 08:30
Problem mit Cookies JeeZ PHP Tipps 2006 2 08.10.2006 17:59
Komisches Problem mit sessions FBI PHP Tipps 2007 5 22.11.2005 14:15
Problem mit Sessions unter PHP 4.4.0 betrazivis PHP-Fortgeschrittene 1 12.10.2005 19:21
SESSIONS über MYSQL Problem - schreiben lesen Cyberbob_at_tot PHP Tipps 2005-2 9 19.09.2005 13:17
header() und Sessions Stümper PHP Tipps 2005 8 02.06.2005 20:12
[Erledigt] php mail() header & Spam Problem PHP-Fortgeschrittene 4 04.05.2005 12:31
problem mit header PHP Tipps 2004 4 06.10.2004 17:19
[Erledigt] Sessions: Cookies mit Zertifikat PHP-Fortgeschrittene 0 16.09.2004 22:01
[Erledigt] ZIP Download - Header Problem PHP-Fortgeschrittene 1 19.08.2004 02:41
header ("location: ") Problem PHP Tipps 2004 3 18.08.2004 12:03
header problem PHP Tipps 2004 8 08.08.2004 00:35
Cookies in Sessions umwandeln PHP Tipps 2004 1 04.07.2004 16:09
Sessions mit und ohne Cookies (die 100.?) PHP Tipps 2004 2 02.07.2004 15:30
Problem mit header() PHP Tipps 2004 6 13.06.2004 16:14

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mit cookie anmeldung umgehen, php cookie login mit ie nicht möglich, cookies aus umgehen, cookies header problem, if(!isset($cont), php header umgehen, php cookies session header, username conturi password, logout cookie und session php, \passwort\ \internet explorer\ \nach logout\ \cookie\, cookie setzen umgehen, session php cokkie gesetzt problem, php cookie nach header setzen, ie seitenaufruf nach logout möglich, php cookies von 3 anbieter umgehen, session login um remember erweitern, session cookie umgehen, http://www.php.de/php-tipps-2006/39574-problem-bei-sessions-komb-m-cookies-header-umgehen.html, $_get header cookie, sicherheitsüberprüfung sessions php

Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.