Avatar billede xicrow Nybegynder
09. september 2010 - 16:21 Der er 17 kommentarer og
1 løsning

"Sessions"-class

Hey Eksperter.


Jeg har siddet og rodet lidt med en "sessions" class (som egentligt bruger cookies), da jeg efterhånden et par gange er rendt i problemer med almindelige sessions ($_SESSION).

Derfor kunne jeg godt tænke mig at høre jeres mening om den, samt meget gerne ideer til forbedringer og/eller rettelser.

Selve class'en kan ses her:
http://pastebin.org/834667

Og her en super-fantalastisk-simplificeret udgave af bruger login, validering og logud:
http://pastebin.org/834668

Bemærk venligst at det kun er meningen at denne class skal kunne erstatte hvad man normalt bruger sessions til mht. login, og ikke at den skal styre hele login forløbet.


/xicrow
Avatar billede coderdk Praktikant
09. september 2010 - 19:16 #1
Pastebin virker ikke rigtig - Men du ved godt, at du kan tilpasse PHP's sessions ret meget, ikke? Se evt. http://dk2.php.net/manual/en/book.session.php og custom handlers: http://dk2.php.net/manual/en/function.session-set-save-handler.php
Avatar billede repox Seniormester
09. september 2010 - 19:50 #2
Jeg er egentlig lidt nysgerrig efter at vide hvilke problemer sessions har forvoldt OP siden han mener at det er bedre at ligge dataene hos klienten?
Avatar billede xicrow Nybegynder
09. september 2010 - 20:35 #3
Kan godt se det er svært at sætte sig ind i når pastebin ikke virker :P Så jeg prøver lige med pastesite i stedet:

Class:
http://pastesite.com/18631

Demo:
http://pastesite.com/18632


#1 Ja jeg ved skam godt at man kan rode med diverse forskellige session indstillinger og funktioner, hvilket jeg også har gjort utallige gange.

#2 De problemer jeg har haft med sessions, kan vidst bedst beskrives som underlige.
Har ifølge fejl logge fundet ud af at sessions til tider "forsvinder", som i at den f.eks. fint kan finde $_SESSION['user_id'] på linie 20, men på linie 50 i samme fil, gir den "undefined index".
Nogen gange er det lykkes slet ikke at kunne sætte en session, og andre gange "forsvinder" de efter et par reloads.

Det er endnu ikke lykkes mig at genskabe disse problemer på en test-server, men jeg kunne umiddelbart forestille mig at det har noget med GC at gøre, hvilket også er derfor jeg har studeret det godt igennem, og kom til sidst frem til at man kan justere den lidt, men man kan aldrig justere den til at gøre præcist som man gerne vil. Det er det jeg prøver på at opnå ved at lave/bruge denne class.

Og for lige at kommentere:
#2 "...siden han mener at det er bedre at ligge dataene hos klienten...".
Så mener jeg så sandeligt på ingen mulig måde at det er bedre, og jeg kan selvfølgeligt godt se at det ikke er nemt at vide hvordan det skal fungere når pastebin ikke virker.

Men meningen er når du logger på mit site, så bliver der oprettet en "session" til dig i en tabel, sammen med dit bruger ID og dato og tid for sidste aktivitet. Derefter den gemmer ID'et for denne række i en cookie.
Når den så skal validere at du er gyldig bruger og logget ind, henter den dit session-id fra cookien, og tjekker om du findes i tabellen, samt om dit login er udløbet.
Hvis den siger god for dig, returnere den det gemte bruger ID, hvorefter videre validering kan foretages.

Hold da kæft for en smøre :P

/xicrow
Avatar billede coderdk Praktikant
09. september 2010 - 21:52 #4
Jeg ville gå koden igennem. Der kan være mange årsager til at man oplever underligheder ved sessions. Oftest er det pga at der har været output til browseren før session_start() - andre gange kan det være at session_start() bliver kaldt mere end én gang.
Jeg har aldrig oplevet _ikke_ at kunne løse eventuelle problemer ved at gennemgå koden minutiøst. Og jeg har lavet PHP rimeligt længe, og på rimeligt mange servere :)
Avatar billede xicrow Nybegynder
10. september 2010 - 00:40 #5
#4 Jeg har efterhånden også rodet med PHP et godt stykke tid, og på forskellige servere. Og jeg siger skam heller ikke at det er alle servere den er gal med, men et par enkelte servere / server-configurationer kan det åbenbart gå galt.

Og tro mig, jeg har gået koden i gennem så uhyggeligt mange gange, og de fejl du nævner har været udelukket fra start af, da jeg altid laver mine sites med en "startup" fil som bla. kører session_start(), samt at jeg på de fleste sites (hvis ikke alle) bruger OB.

Men men men...

Nu var det ikke meningen at vi skulle diskutere om jeg skal bruge sessions eller ej, eller eventuelle fejl jeg måske har haft, selvom det da er en hyggelig snak :P

Jeg ville såmænd bare gerne have andres vudering af om den class jeg har lavet er brugbar, til at styre hvorvidt ens brugere er logget ind, og om der måske er noget input til rettelser / forbedringer af den.

/xicrow
Avatar billede showsource Seniormester
10. september 2010 - 09:09 #6
Et problem som kan opstå, er hvis man bruger samme navn til både en session ( eller anden superglobal ) og en defineret var, på en server hvor register_globals er On

$_SESSION8["noget"] = "Et eller andet";

$noget = "Noget helt andet";

$_POST["noget"] = "Noget helt tredje";

En ting man let "overser" eller glemmer når man laver php kode.

Og nej jeg har ikke kikket din kode ...
Avatar billede repox Seniormester
10. september 2010 - 10:21 #7
Jeg kiggede kort på klassen og besluttede derefter at undlade at kigge på implementationen:

1. Klassen forudsætter at jeg har en mysql forbindelse tilgængelig 2. Klassen kan instansieres, men har kun statiske funktioner
3. Klassens navn indikerer at brugen er til sessions, og ikke bare en besynderlig måde at anvende cookies på

Det er ikke noget jeg finder anvendeligt - jeg har ingen forslag til forbedringer, da hensigten med klassen er uforståelig i forhold til bedre eksisterende alternativer.
Avatar billede xicrow Nybegynder
10. september 2010 - 12:01 #8
Godt så, for lige at skære det ud i pap, så har jeg fundet ud at i tilsyneladende ikke har haft nogen problemer med sessions.
Dog ville jeg gerne se en af jer give et bud på session-indstillinger, hvis jeg gerne vil have nøjagtigt 1 times timeout på mine logins.

#7
1. Ja det gør den, da den bruger en tabel i databasen, og da det er en class jeg sidder og roder med skal den sandelig heller ikke opfattes som færdig endnu, langt fra. Derfor valgte jeg en en simpel hurtigt løsning til at kunne arbejde med databasen.
2. Rettet, se nedenstående.
3. Rettet, se nedenstående.

Jeg har lavet et par småændringer til class'en, samt peppet demo'en lidt op, som kan ses herunder:
Class: http://pastesite.com/18648
Demo: http://pastesite.com/18647

#7
Hensigten med class'en og dens funktioner har jeg forklaret et par gange.
Men kan du fortæller mig hvad $_SESSION['user_id'] gør bedre end denne løsning ? Ud over at det er hurtigere :P
Avatar billede repox Seniormester
10. september 2010 - 12:24 #9
#8
Session timeout til en time:
ini_set("session.gc_maxlifetime", 3600);


Hvorfor sessions er bedre end din løsning?
Sessions - login.php:
<?php
  ini_set("session.gc_maxlifetime", 3600); // for argumentationens skyld - kan også sættes i htaccess, php.ini eller bare i en konfigurationsfil
  session_start();
 
  $username = 'test';
  $password = '1234';
   
  if ( $username == 'test' && $password == '1234' )
  {
      $_SESSION["userId"] = 1;
      $_SESSION["kontrol"] = sha1($_SERVER["REMOTE_ADDR"]."mit-site.dk");
      header("Location: validate.php");
  }
 
?>


Sessions - validate.php
<?php
  ini_set("session.gc_maxlifetime", 3600); // for argumentationens skyld
  session_start();
   
  if( !isset($_SESSION["userId"]) || $_SESSION["kontrol"] != sha1($_SERVER["REMOTE_ADDR"]."mit-site.dk") )
  {
    header("Location: login.php");
    exit;
  }
?>


Din løsning - som fylder væsentligt mere i og med din ekstra kode med klassen og databasetabellen er en del af hele projektet - letter altså derfor ikke en simpel procedure som i forvejen er velunderstøttet af PHP bundle...
Avatar billede xicrow Nybegynder
10. september 2010 - 12:29 #10
Her er jo netop problemet:
gc_maxlifetime

Det betyder jo bare at session højst må leve f.eks. 1 time, men at de sagtens kan blive slette før det...

Og jeg siger heller ikke at sessions er bedre end min løsning, jeg prøver på ingen måde overhovedet at erstatte sessions, blot at finde en alternativ måde til lige netop den ene session der skal afgøre om en bruger er logget ind eller ej...
Avatar billede repox Seniormester
10. september 2010 - 12:32 #11
Du vil gerne tvinge klienterne til at beholde deres session i en time, selvom de måske ikke har brug for den mere?

Ellers må du uddybe hvad formålet er med dit 'timeout' på en time?
Avatar billede repox Seniormester
10. september 2010 - 12:33 #12
Jeg kan jo også slette mine cookies inden der er gået en time - det har du ingen kontrol over...
Avatar billede xicrow Nybegynder
10. september 2010 - 12:41 #13
# 11
Det har intet at gøre med at klienten skal beholde deres sessions i en time, men derimod at så længe de ikke har valgt at logge af sitet, har de 1 times "inaktiv"-tid inden de automatisk bliver logget af.

Det er det jeg har haft problemer med at styre med sessions, eller faktisk er det GarbageCollectoren jeg har haft problemer med, da den så vidst jeg har forstået det er umulig at indstille præcist.

# 12
Det samme kan du med sessions...
Avatar billede repox Seniormester
10. september 2010 - 12:51 #14
#13
Jeg hopper af her; jeg fatter ikke en klap af hvad du mener problemet er og det hjalp mig ikke at spørge.

Og ja, selvfølgelig kan du slette en session når du vil - konceptet er det samme...
Avatar billede xicrow Nybegynder
10. september 2010 - 14:01 #15
Okay repox.

Nu prøver jeg lige at forklare mig på en anden måde.

Som den nørdede programmør jeg er, sidder jeg tit og roder med forskellige emner, ikke nødvendigvis fordi det skal bruges til noget specifikt, mere for at se om det kan lade sig gøre og derefter måske bruges til noget.

Da jeg tidligere har oplevet at der kan opstå problemer med sessions, om det så skyldes forkert programmering, serveropsætning, php-version, what-ever, tænkte jeg at jeg ville forsøge at lave et alternativ til at bruge sessions specifikt rettet mod login.

Det er så blevet til denne class, som jeg søger input til om hvorledes den er brugbar til at validere om en bruger er logget ind på et site, samt om der er nogen der har ideer til at forbedre nogen af elementerne, gode tips til sikkerheden i det, eller at lavet noget af det på en anden måde.

Som jeg selv ser det, syntes jeg den opfylder sit formål ganske fint, idet jeg selv har testet den, og fundet ud af at tingende fungere som jeg havde regnet med.

Du skal så også have i tankerne at det kun er en "kladde" af hvordan den færdige class kommer til at se ud, der skal selvfølgelig tilføjes forskellige former for kryptering af data'en ved klienten, samt bedre validering af om brugeren nu også er gyldig.

Derudover er det slet ikke sikkert at det kommer til at fungere som en individuel class, men nok nærmere at det bliver indbygget i en "user"-class, noget ala:

$user = new user(1);
$user->login();
$user->validate();
$user->logoff();


Jeg håber nu at du bedre forstår hvad pointen er med at jeg oprettede "spørgsmålet", ellers beklager jeg meget.

Hvis du hopper af alligevel, lukker jeg spørgsmålet da det efterhånden er kommet ud på et sideplan, men så må du gerne smide et svar og få point for en god diskussion :)


/xicrow
Avatar billede repox Seniormester
10. september 2010 - 15:27 #16
Jeg forstår stadig ikke problematikken omkring dine sessions; det eneste jeg har forstået indtil videre er at du ikke har kunne få det til at fungere.
Hvad du mente med 'en times timeout' blandet sammen med kommentaren om 'at man kan slette den inden en time' har jeg slet ikke kunne stykke sammen til en forståelig problemstilling.

Men... ikke desto mindre må min konstatering være at jeg synes du blander tingene for meget sammen og bevæger dig langt væk fra essensen bag sessions og/eller cookies.

Om du implementerer det i et 'user' objekt eller noget andet, så løser du en ultra-simpel procedure på en utrolig besværlig måde, ved at skrive en funktionalitet som allerede eksisterer samtidig med at du gør den funktionalitet afhængig af ekstern database.

Jeg er af den overbevisning at de tre ting, du nu vælger at blande sammen, tilsammen ikke udgør et stærkere element end hver for sig. Jeg vil ingen gavn få at det du har lavet nu - og jeg tror heller ikke der er andre der kunne få gavn af det (hvis man har grundlæggende viden om sessions). At du så implementerer objektet i et større objekt, kun for at lave et brugersystem gør kun idéen/projektet mere specifikt og det vil kun kunne bruges af folk som efterlyser de specifikke muligheder.
Avatar billede xicrow Nybegynder
10. september 2010 - 15:32 #17
Ok fair nok.

Vil du smide et svar så får du sq lige nogen point for din tid.

/xicrow
Avatar billede repox Seniormester
10. september 2010 - 15:37 #18
Du fik svar her...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester