You are not logged in.

wcf.regNote.message

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

1

Friday, August 24th 2007, 8:35am

Problem beim Umgang mit Sessions

Ich bin in einem Projekt was am basteln und versuche grade mit Sessions dann innerhalb des Projekts den angemeldeten User zu identifizieren. Das heißt wenn ein User sich einloggt bekommt er eine Session ID und mittels dieser soll er eben auf jeder Unterseite als der User erkannt werden. Ich möchte allerdings nicht das die Session ID in der URL mit übergeben wird also sprich die Session ID soll nicht sichtbar sein. Da stehe ich grade etwas auf dem Schlauch und komme nicht weiter.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

flo

Unregistered

2

Friday, August 24th 2007, 2:30pm

wenn du die SID nicht per URL übergeben möchstest, also per "GET" dann solltest du es mit cookies oder per post versuchen..


grummel
hab hier grad nen langen text geschrieben, aber wieder gelöscht. ist besser du liest das mal auf selfphp nach, als dass ich mir jetzt was zusammenstottere... ist zu lang her.

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

3

Friday, August 24th 2007, 4:47pm

Ich hab mich heute da mal eingelesen und es gibt verschiedene Ansätze wie man das lösen kann. Ich sehe das Problem bei Cookies die beim User liegen immer darin das ich ne doppelte Sicherheit brauche damit der User die SID nicht manipuliert. Das heißt wenn er wie auch immer die ID von einem Administrator bekommt könnte er unter gewissen Umständen darüber administrativ tätig werden. Diese Lücke gab es z.B. auch beim WBB mal. Ich suche einen Weg dieses Problem zu umgehen so das erst gar keine Sicherheitsprobleme auftreten könnten. Das heißt der User darf weder auf die SID noch auf irgendwelche anderen Dinge die mit Berechtigungen zu tun haben Einfluss haben.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

flo

Unregistered

4

Friday, August 24th 2007, 6:42pm

ja, das problem wirst du aber immer haben denke ich mal...
zumindest solange du auf der sessionid als basis bleibst.
ansonsten gib doch irgend eine sache der sessionid mit zb....
wenn in $SID die session drin gespeichert ist...
dann:

$SID:=$SID.md5($username);
oder sowas.... dann wird das jedes mal auf der seite überprüft und die optionen für admins etc kannste dann ja freischalten, per script

die sid hat ja ne bestimmte länge (oder?) und alles was danach kommt (genau 32 zeichen, da md5) kannste dann überüfen...
if (32stellen nach der sid == md5(username))
usw usw

oder gib per $_SESSION variablen noch informationen mit, die du jedes mal überprüfst...


$_SESSION['username']:=$login_name;

$login_name ist dann der name des zugehörigen textfields... oder vllt sauberer gescripted:

$_SESSION['username']:=$_POST['login_name']

so oder so ähnlich ging das glaub ich....

da kannste dann auch per session folgendes übergeben ...

$_SESSION['eingeloggt']:=true oder false ....
$_SESSION['admin']:= true oder false ....

und dann in der geschützen datei dann immer abfragen:
if ($_SESSION) oder ($_SESSION==true)
usw...

This post has been edited 1 times, last edit by "flo" (Aug 24th 2007, 6:44pm)


Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

5

Friday, August 24th 2007, 7:09pm

Man das ist echt ein Schrott irgendwie. Das Projekt für das ich das erstelle ist mein eigenes und ich überlege im Moment ob ich überhaupt eine Administrierung mit anlege oder ob ich nicht einfach das was zu administrieren ist direkt in der Datenbank mache. Dann brauch ich keine Bedenken haben das irgendwer an Funktionen kommt an die er nicht ran soll.

Gibts eigentlich irgend ne komplette Alternative zu Sessions?

Ich hab auf dem Projekt eine Registrierung und natürlich dann einen Login und ein Eingelogter User kann z.B. sein Profil bearbeiten und sieht alles was mit seinem User Account zu tun hat. Ich muss also schon einen User zweifelsfrei identifizieren damit er nicht irgend ein beliebiges Profil editiert.

Das Problem ist eben auch das ich kein Kriterium beim User habe was immer verschieden ist. Das heißt der Name und Vorname kann bei mehreren Usern gleich sein genau wie andere Angaben auch. Ich müsste schon z.B. Name, Vorname, Geburtsdatum, Geburtsort und was weiß ich alles nehmen damit wirklich zweifelsfrei kein zweiter User das gleiche hat. Sonst hätt ich ja auch einfach einen Wert generieren können und den mittels Formularübergabe also per Post einfach weiter reichen und solange der Wert passt ist der User identifiziert.

Ich glaub aber ich kann das mit der Session so machen oder nicht? Ich lasse dem User bei korrektem Login eine Session generieren und gebe die einfach von Seite zu Seite weiter. Oder macht mir register_globals=off da einen Strich durch?

Ich bin schon total verwirrt vor lauter gefummel und gemache. Alle drei Zeilen muss ich mir was einfallen lassen um eine mögliche Sicherheitslücke zu umgehen. Man sollte echt den ganzen Kiddies die nichts besseres zu tun haben als irgendwelche Projekte zu knacken die Finger abhacken!
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

flo

Unregistered

6

Friday, August 24th 2007, 10:47pm

:mrgreen:

weiter weiß ich auch nicht, tut mir leid. sessions sind halt nicht sicher, einen anderen weg kenne ich nicht.... sonst würde ich sofort auf sessions verzichten.

solang du die session am ende wieder destroyst sehe ich da nicht so ein großes problem... es dauert ja auch ein bisschen bis jmd die sessionid herausfindet, die gerade aktiv ist ;)

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

7

Friday, August 24th 2007, 11:13pm

Naja hier im WBB ging das durch eine Lücke in der Suche und sowas gibts bei mir ja nicht. Das heißt eine Suche gibts schon und das auch recht ausgeklügelt mit sicheren Treffern und möglichen Treffern und sowas aber an der Stelle weiß ich ja auf was ich achten muss. Ganz davon abgesehen das den Quellcode des Projekts eh keiner bekommt da ich das ganze nicht anbieten werde sondern absolut nur für den eigenen Gebrauch baue.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Noisy

Trainee

Posts: 65

Location: Frankfurt

  • Send private message

8

Saturday, August 25th 2007, 1:15am

Sofern es für dich selbst machst:
wenn du session_start() eingibst, und das auf allen seiten vorhanden ist und du vorher eine $_SESSION festgelegt hast, so wird diese übernommen, dazu benötigt man nicht einmal die sID.

Sollte eine Übernahme nicht möglich sein, einfach die Session ID an eine bestimme IP binden.

badmoon2049

Intermediate

Posts: 188

Location: Leipzig

Occupation: Azubi

  • Send private message

9

Saturday, August 25th 2007, 9:22pm

hmmm... wo ist das problem ??

du speicherst die seasion ID (DEIN hash den DU selbtgeneriert hast) in einer Seasion Var..


ne alternativer wäre über getvars nen hash immer mitzugeben und anhand diesen schauen ob wer eingelogt ost oder nicht

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

10

Sunday, August 26th 2007, 1:15am

Ich glaub ich hab da ne recht gute Lösung gefunden. Ich bin mir nur noch nicht so sicher ob das wirklich so funktioniert wie ich mir das vorstelle.

Nur so am Rande - vorhin hab ich nachgelesen ob ich über ActiveX irgendwie Zugriff auf den Bios Hash bekomme um den zur Identifizierung zu nutzen. So weit ist es schon gekommen mit meiner querdenkerei hier.

Ich gehe jetzt einen ganz einfachen weg. Jeder User hat eine eindeutige 20 Stellige ID und mit der generiere ich mit einem eigenen Algorythmus einen Hash und binde den an eine Information die den User eindeutig identifiziert. Mal sehen ob das auch funktioniert wenn ich wild irgendwelche Seiten aufrufe.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

11

Tuesday, August 28th 2007, 12:17pm

Also irgendwie werde ich noch mal irre mit dem Thema. Folgendes ist mir irgendwie jetzt unklar.

Ich hab ein Login Skript gebaut in dem ich Benutzername und Passwort abfrage. Das Skript sucht darauf hin in der User Table ob es mit dem Benutzernamen und dem Passwort einen Eintrag gibt und holt mir dazu passend den Namen und Vornamen raus. Wenn dies der Fall ist starte ich eine Session und registriere die Variablen Login Name, Vorname und Nachname. Wenn ich nun von da aus sagen wir in der Skript Profil gehe möchte ich überprüfen ob die registrierten Veriablen durch irgendwas verändert wurden. Das heißt in dem Skript für das Profil kann ich ja mit session_is_registered('variable') prüfen ob die Variable vorher registriert wurde. Nur wie kann ich prüfen ob diese auch noch dem Inhalt entspricht wie in dem Skript vorher? Es geht mir darum das ein user nicht einfach sich einlogt und dann plötzlich auf der Profil Seite die Variablen manipuliert und da irgendwas rum fuscht. Ich kann ja auch nicht bei jedem Skript wieder erneut das Passwort und alles abfragen da wird jeder User irre wenn man auf jeder Seite sein PW neu eingeben muss.

Oder ist das ganze sicher genug und ich muss mir keine Gedanken machen?

Wie ist das eigentlich wenn der User die Seite verlassen hat. Sofern er auf Logout klickt hab ich ein session_destroy() eingebaut aber wenn er das nicht anklickt wie lange bleibt er für das Skript dann noch eingelogt? Oder ist er sobald er das Browserfenster zu macht automatisch raus? Ich würde das gerne festlegen das er eine Stunde lang noch als eingelogt gilt und danach dann automatisch raus ist.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

badmoon2049

Intermediate

Posts: 188

Location: Leipzig

Occupation: Azubi

  • Send private message

12

Wednesday, August 29th 2007, 12:54am

du machst dir das echt sau kompliziert...

also zu den namen und anderen daten speicherst du in der DB noch einen Hash und einen timestamp ! (2 neue felder)

nun sobald der user sich eingelogt hat speicherst du einen eigens generierten hash und die zeit in der DB und in der session var NUR den hash... anhand diesen wir der user erkannt und können weitere seiten angekuckt werden und daten geladen werden hohle keine daten anhand des benutzernamens oder sowas..

eine Session zu generieren mit dem Namen ist die eine sache was sicher geht dann wäre dein script gehackt..

eine Session zu generieren mit einem gültige hash ist unmöglich

das session_destroy() lösst du damit das du schaust ob der timestamp in der DB nicht abgelaufen ist... wenn ja ist die session ungültig ansonsten is halt noch gültig..

achja. um zu prüfen ob mr. X eingelogt ist einfach in der user tabelle nach dem hash suchen ist er nicht da ist der user auch nicht eingelogt ;) so und nun sind alle probleme gelöst :)

wenn du ein beispiel script haben magst sag bescheid hab da was :)

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

13

Wednesday, August 29th 2007, 8:22am

Ich hab gestern auch noch jede Menge gelesen und mir verschiedene Wege angeschaut. Den Hash in die DB zu schreiben scheint mir auch der beste Weg zu sein da ich so gesehen das Original dann immer in der DB habe und kann alles was die Session betrifft auch damit vergleichen. Und damit einer den Hash Wert in der DB verändern könnte müsste er zumindest mal Zugang zur DB haben und das ist denke ich sehr unwahrscheinlich.

Hab in dem einen Text den ich gestern gelesen habe übrigens noch was gesehen bezüglich Session Timeout und so. Die Lösung ist wie Du geschrieben hast einfach die Timestamps gelegentlich abfragen und wenn die älter wie 60 Minuten sind dann einfach den Hash aus der Tabelle löschen. Den Timestamp kann man ja aufheben dann weiß man wenigstens wann der User das letzte mal eingelogt war.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

14

Thursday, September 6th 2007, 9:36pm

Also irgendwie glaub ich ich werd langsam alt oder so. Ich dachte das Thema hätte ich inzwischen erledigt aber irgendwie doch noch nicht so ganz.

Folgendermaßen arbeitet das ganze jetzt.
Beim Betreten der Seite wird bereits mit session_start(); die Session gestartet. Der User kann sich dann einloggen und sofern die Login Daten korrekt waren rufe ich eine Funktion "login()" auf in der ich zuerst alle Einträge mit der gleichen Userid aus der Tabelle "Sessions" lösche und anschließend einen neuen Eintrag erzeuge in dem ich die Userid und die SessionID ablege. Auf jeder Seite die der User aufrufen kann steht oben immer session_start(); und es gibt eine global verfügbare Funktion logged_in() mit der ich prüfe ob ein User eingeloggt ist. Da mache ich einfach nur eine Abfrage mit WHERE sessionid = session_id() um festzustellen ob der User eingeloggt ist. Das heißt ich kann überall in meinen Skripten mit if(logged_in()) {...}; feststellen ob es sich um einen User oder einen Gast handelt.

So nun zu meinem Problem. Sofern der User den Button "Logout" benutzt zum ausloggen mache ich zuerst ein DELETE FROM sessions WHERE userid = $userid AND sessionid = session_id() und danach ein session_destroi(). Aber was ist wenn der User die Seite ganz einfach zu macht? Die Session ist dann ja früher oder später von alleine weg aber in der theorie könnte ein anderer User irgendwann mal die SessionID von einem User der vor 4 Wochen da war bekommen. Und dann könnte es möglicherweise passieren das die Abfrage positiv verläuft da in der Tabelle sessions die SessionID noch enthalten ist. Ich sehe da eine mögliche Sicherheitslücke die ich mit allen Mitteln schließen möchte. Das heißt ich möchte es so haben das ein User der 10 Minuten nicht da war sofort voll automatisch ausgeloggt war. Nur wie mache ich das? Einen Cronjob auf dem Server will ich nicht laufen lassen. Das heißt es muss mindestens ein User immer da sein anders geht das schon mal nicht. Aber wie bereinige ich das dann anständig? Kann ich eine Session die ein Timeout hatte noch auslesen bzw. deren SessionID ermitteln damit ich die Tabelle bereinigen kann und alle SessionIDs nehme die ein Timeout hatten? Wie kann ich überhaupt ein Timeout festlegen? Ich konnte nichts finden wie session_timeout oder so. Oder hat das mit dem Timeout von PHP zu tun was ich mit iniset ändern könnte?

Ich weiß ich denke mal wieder kreutz und quer aber ich möchte das ganze so perfekt wie möglich machen :)
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

15

Sunday, September 9th 2007, 12:26am

Hat hier keiner ne gute Idee wie ich das lösen könnte? Mir ist noch nichts besseres eingefallen als wie manuell eine Funktion auszuführen die anhand eines Timestamp prüft wie lange die Session nicht aktiv war und diese dann auch der DB löscht.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

turrax

Beginner

Posts: 3

Location: Ufr

Occupation: Selbstständig

  • Send private message

16

Tuesday, October 23rd 2007, 10:39pm

Also gut, ich helf dir mal weil ich eben mal diese Sinnlosen Antworten durchgelesen habe..

Du kannst es per Sql lösen oder wie gesagt mit Php, das problem ist aber solang keiner ein script ausführt wird auch keine modifizierung deiner db durchgeführt.. Außer du regst dich beim cronjob der alle 5minuten mal da hinklickt, damit diese ausgeführt werden..

Hau in dein Dingsda wo du die logindaten prüfst und auswertest einfach

$db_timestamp = now(); rein <--hauste in db
So dann hauste in einer datei wo du immer mit includest schötzungsweise config oder wie auch du es nennst..

da hauste das gleiche nur mit $timestamp_rein (wird bei jedem klick aktualisiert)



danach vergleichste if($timestamp > $db_timestamp) {//true } else { //false}
::Wer die Qual hat, hat die Wahl::

wcf.user.socialbookmarks.titel