WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   PHP Sessions (http://www.wcm.at/forum/showthread.php?t=150118)

hurt 11.11.2004 20:34

PHP Sessions
 
hallo

ich habe eine frage zu PHP sessions

also ich hab eine datenbank mit user & passwort.
der user meldet sich an und die session-variable wird zum username.
die session-variable bleibt dann so lange der username bis er sich mit session_destry() ausloggt.
reicht das als ueberpruefung ob er angemeldet ist auf den folgeseiten und ist das auch sicher?

danke
michi

T.dot 11.11.2004 20:54

Reichen wirds wohl, bis auf das Problem, das immer wieder auftritt (korrigiert mich wenn ich mir irre), dass Sessions nicht komplett gelöscht werden, wenn falsch eingestellt und Browser geschlossen, etc.

Sicher kommt mir das ganze aber nicht vor, ich würds eher so lösen, das neben dem Usernamen noch ein zufällig generierter Key übergeben wird, der gleichzeitig in ner Datenbank hinterlegt wird. Beim Seitenaufruf würd ich dann überprüfen ob zum Usernamen der Key in der Datenbank passt und passta - wennst lustig bist kannst natürlich noch usernamen verschlüsseln und so, ein maximum an sicherheit wirst mit sessions alleine halt nicht erreichen (meiner meinung) - fragt sich halt immer für welchen anwendungszweck die spielerei is...

mfg Thomas

Potassium 11.11.2004 20:56

imho nicht.
1.) musst du aufpassen, dass entweder register_globals auf OFF ist oder du bei JEDEM seitenaufruf prüfst ob session_user und session_pw mit dem aus der datenbank übereinstimmen.
2.) pw in der session als md5() hash speichern
3.) statt benutzernamen lieber eindeutige benutzerid nehmen

hurt 11.11.2004 21:05

@T.dot

was meinst du mit zufaellig generiertem key?
ein string der bei der REGISTRATION der users generiert wird und in der db gespeichert wird? oder ein string der JEDESMAL wenn er sich EINLOGGT generiert wird und in die datenbank gespeichert wird und zur ueberpruefung gilt?

Potassium 11.11.2004 21:08

Zitat:

Original geschrieben von hurt
@T.dot

was meinst du mit zufaellig generiertem key?
ein string der bei der REGISTRATION der users generiert wird und in der db gespeichert wird? oder ein string der JEDESMAL wenn er sich EINLOGGT generiert wird und in die datenbank gespeichert wird und zur ueberpruefung gilt?

ich denk jedesmal.

hurt 11.11.2004 21:20

aber ...

"Die Daten zu solch einer Sitzung werden unter der Kennnummer auf dem Webserver abgelegt. Die Vorteile: Es gibt keine Begrenzung der Datenmenge, die Daten sind sicher bzw. korrekt und die Daten müssen nicht per <input type="hidden" ... > dauernd zwischen Browser und Webserver hin- und hergeschickt werden, womit sich die Sicherheit gegen Datenmanipulation erhöht."

reicht es dann nicht wenn kein user eingeloggt ist dass die session-variable leer ist und so der seitenaufruf verhindert wird? und wenn ich dann einen eingeloggten user hab (auch wenn er die seite zu macht, ist er dann halt wieder eingeloggt, das will ich eh so) kann er die seite aufrufen (also wenn die session-variable gleich einem user ist den es in der datenbank gibt - die ueberpruefung des passworts kommt eh beim login).

Potassium 11.11.2004 21:26

Zitat:

Original geschrieben von Potassium
imho nicht.
1.) musst du aufpassen, dass entweder register_globals auf OFF ist oder du bei JEDEM seitenaufruf prüfst ob session_user und session_pw mit dem aus der datenbank übereinstimmen.
2.) pw in der session als md5() hash speichern
3.) statt benutzernamen lieber eindeutige benutzerid nehmen

ajo und ne eigentschaft von sessions ist, dass wenn du den browser zu machst, die session ungültig wird.

hurt 11.11.2004 21:40

aber wenn ich den browser schließe und dann die seite wieder aufrufe bin ich noch immer eingeloggt

Potassium 11.11.2004 21:42

Zitat:

Original geschrieben von hurt
aber wenn ich den browser schließe und dann die seite wieder aufrufe bin ich noch immer eingeloggt
welcher browser?
wie machst du sessions?
mit setcooke() oder mit session_register()/$_SESSION[] = "";

hurt 11.11.2004 21:47

session_start();
session_register('sessionuser');

if($do=="logout") {
session_unregister('sessionuser');
session_destroy();
}

hurt 11.11.2004 21:52

da wird es zB auch nicht anders gemacht

http://www.tutorials.de/tutorials9684.html

ich benutze sessions das erste mal und weiß nicht wie sicher das ist, aber wenn ichs schon in vielen tutorials gelesen hab dass es so geht?

ruprecht69 12.11.2004 00:02

Zitat:

Original geschrieben von Potassium
ajo und ne eigentschaft von sessions ist, dass wenn du den browser zu machst, die session ungültig wird.
das glaube ich nicht tim ...

kommt immer auf die Einstellung (in dem Fall php.ini) an. Sessions können Jahre aktiv sein (schon mal 'remember me' irgendwo angeklickt und nach dem nächsten reboot warst du immer noch eingeloggt?)).

jak 12.11.2004 00:16

Die remember me Sachen gehen über Cookies.

Jak

Potassium 12.11.2004 07:16

Zitat:

Original geschrieben von ruprecht69
das glaube ich nicht tim ...

kommt immer auf die Einstellung (in dem Fall php.ini) an. Sessions können Jahre aktiv sein (schon mal 'remember me' irgendwo angeklickt und nach dem nächsten reboot warst du immer noch eingeloggt?)).

ad1: siehe jak
ad2: anklicken tu ich gar nix. weil fürn apache gibts unter windows afaik kein grapisches konfig-menu.

cg32 12.11.2004 11:11

Die Sessions sind aber serverseitig noch aktiv (wie soll der Server auch mitkriegen, dass du deinen Browser geschlossen hast).

Deswegen ist auch Session Hijacking etc. möglich.

Normale PHP Sessions sind sehr unsicher.

Je nachdem wie sicher man es haben möchte sollten folgende Dinge selbst implementiert werden:

- Timeout der Session (zB mittels Session Storing in DB)
- Gegenstelle prüfen (zB mittels IP o. Agent oä. - kann probleme geben zB bei AOL Proxy, der über mehrere IPs geht - besser mittels eines "Fingerprints" der zB aus Timestamp, Agent, Referrer etc. besteht und auf jeder Seite neu generiert wird)
- Transaction IDs
- IMMER bestimmte Variablen prüfen, auf jeder Seite - zB Password als MD5 Hash mit der DB vergleichen. Sonst reicht mir die SessionID um die Session zu hijacken.

oä.

hurt 18.11.2004 08:16

"- IMMER bestimmte Variablen prüfen, auf jeder Seite - zB Password als MD5 Hash mit der DB vergleichen. Sonst reicht mir die SessionID um die Session zu hijacken."

meinst du ich soll das password als md5() als session-variable und in der datenbank speichern?

oder soll ich einfach mit einem php script das passwort immer zur naechsten seite weitergeben mit $_GET, dort mit dem datenbankeintrag vergleichen und wenns stimmt erst mit der session weitermachen?

Pulse-Seeker 18.11.2004 09:06

wenn dann gibs mit $_POST weiter da bei $_GET die daten an die url angehängt werden, bei $_POST nicht!

cg32 18.11.2004 12:21

Zitat:

Original geschrieben von hurt
"
meinst du ich soll das password als md5() als session-variable und in der datenbank speichern?

Genau - in der DB steht der MD5 Hash des Passworts und mittels Sessionvariable wird er ebenfalls übergeben.
Diese beiden Werte bei jedem Aufruf gegenchecken.

Potassium 18.11.2004 14:18

Zitat:

Original geschrieben von hurt
"

meinst du ich soll das password als md5() als session-variable und in der datenbank speichern?


genau das :)

FordPrefect 18.11.2004 17:30

Zitat:

Original geschrieben von Pulse-Seeker
wenn dann gibs mit $_POST weiter da bei $_GET die daten an die url angehängt werden, bei $_POST nicht!
Gibt es eine Möglichkeit Variablen über $_POST mittels eines Links weiterzugeben?
mfg
Peter

Potassium 18.11.2004 17:47

Zitat:

Original geschrieben von FellnerPeter
Gibt es eine Möglichkeit Variablen über $_POST mittels eines Links weiterzugeben?
mfg
Peter

nein weil ein link die GET methode benutzt und nicht die POST methode.

hurt 18.11.2004 18:33

@cg32

wie genau meinst du das?

nur ein paar code-auszuege...

session_start();
session_register('username');
session_register('md5password');

// LOGOUT:
if ($do == "logout") {
session_unregister('username');
session_unregister('md5password');
session_destroy();
}

// BEIM LOGIN:
$_SESSION['username'] = $_POST['username_vom_formular'];
$_SESSION['md5password'] = md5($_POST['password_vom_formular']);

und dann bei jeder datei wo ich eine ueberpruefung brauch ob wer angemeldet ist ...

session_start();
session_register('username');
session_register('md5password');

$result = mysql_query("SELECT user,pass FROM users WHERE user='$_SESSION['username']' AND pass='$_SESSION['md5password']'");
$menge = mysql_num_rows($result);

wenn jetzt menge == 1 ists ok, andernfalls ists nicht ok



passt das so?

Potassium 18.11.2004 19:09

is zwar ned an mich gerichtet aber wurscht :D
also
für logout für ich ne eigenen function machen. is imho praktischer aber nicht nötig.

dann beim einloggen
PHP-Code:

$uname strval($_POST['User_Name']);
$pw strval($POST['User_PW']);
$query mysql_query("SELECT User_ID FROM user_table WHERE lower(User_Name) = '".$uname."' AND User_PW = '".md5($pw)."' LIMIT 1");
if(
mysql_num_rows($query) > 0){
$row mysql_fetch_array($query);
$_SESSION['UID'] = $row['User_ID'];
$_SESSION['PW'] = md5($pw);
}
else{
echo 
"false credentials";


userid deswegen, weil die auf jeden fall eindeutig ist und auch, wenn die benuzter unbenannt werden, nicht geändert werden.

logout ca so:
PHP-Code:

function logout(){
session_destroy();
session_regenerate_id();



hurt 18.11.2004 19:31

danke!

im prinzip eh das gleiche wie meine code schnippsel

wollts ja nur mal zeigen und fragen ob es theoretisch so geht
die ganzen ueberpruefungen dass man ja nix boeses eingeben kann kommen ja noch =)

cg32 18.11.2004 19:48

Danke Potassium ;)

Dem gibts nichts hinzuzufügen - mach zumindest eine solche Überprüfung um enie allzuleiches Hijackig der Session zu verhindern.


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag