Avatar billede tralala Nybegynder
18. juni 2012 - 09:03 Der er 32 kommentarer og
1 løsning

Glemmer sessionen?

Hej, jeg har et shopmodul som har en tildens til at glemme sessionen når kunden afslutter købet.

Således:

www.mitdomæne.dk/kassen.php

<kunden trykker afslut og går til næste side som er>

www.dibs.dk/betalingsmodul

<kunden betaler beløbet og trykker videre og går tilbage til min side>

www.mitdomæne.dk/afslut.php

<kunden når ikke at se afslut.php, og bliver hurtigt sat videre til paagensyn.php>

Problemet er bare, at sessionen ofte går tabt når kunden forlader min side, og hopper over til betalingsmodulet. Hvis kunden ikke forlader siden, e.g. går fra kassen.php til afslut.php så virker det uden problemer. Hvad er logisk at gøre? Bruge cookies?
Avatar billede erikjacobsen Ekspert
18. juni 2012 - 09:37 #1
Gætteri: Kunden bestiller på www.mitdomæne.dk, men stilles tilbage fra dibs til mitdomæne.dk - og sessionscookien er ikke sat til at kendes på begge.
Avatar billede tralala Nybegynder
18. juni 2012 - 10:28 #2
http://www.webopedia.com/TERM/S/session_cookie.html Sessioncookies bum bum... 

På mine egne sider bruger jeg kun følgende format:

session_start();

if (!(isset($_SESSION['sessionbrugernavn']) && $_SESSION['sessionbrugernavn'] != '')) {
header ("Location: shop.php?fejl=1");
}

$brugernavn = $_SESSION['sessionbrugernavn'];


Dvs. en almindelig php-session, og nogle gange vil den godt fange data efter kunden har kørt forbi betalingemodulet, men andre gange så glipper det totalt. Kan man overhovedet bruge sessionen på den måde jeg gør? Er det bedre at gå over til noget mere almindeligt cookie-halløjsa?
Avatar billede erikjacobsen Ekspert
18. juni 2012 - 10:38 #3
Jo, sådan gør man. Bagved lægger PHP en cookie, der identificere sessionen (lang tilfældig streng), mens værdierne i sessionsvariablerne ligger på serveren.

Men cookies sendes kun tilbage fra browseren, når de må sendes. Hvis de er sat så sessions på www.mitdomæne.dk ikke må sendes til mitdomæne.dk (eller omvendt), så kan du få den beskrevne reaktion).

Men om det så er forklaringen kan jeg ikke sige. Du kan overveje at sætte dit system op, så den kun bruger www.mitdomæne.dk (eller kun mitdomæne.dk), og automatisk videresender fra det "forkerte" til det "rigtige".
Avatar billede tralala Nybegynder
18. juni 2012 - 10:58 #4
Jeg prøver at snakke lidt med dibs og høre hvordan man normalt gør hos dem - takker for hjælpen :o)
Avatar billede erikjacobsen Ekspert
18. juni 2012 - 11:21 #5
Det er tænkeligt at dibs har erfaringer med det, men det er dit webhotel/webserver/php, der driller.
Avatar billede olebole Juniormester
18. juni 2012 - 14:59 #6
<ole>

Husk, at hvis der sættes cookies på din side, er det lovpligtigt eksplicit at informere brugeren om, hvem der sætter cookie(s) og hvad de(n) skal bruges til.

Brugeren skal give sin udtrykkelige tilladelse til, at der bliver sat cookie(s) - ligesom hun skal have mulighed for at tilbagetrække en evt. givet tilladelse.

/mvh
</bole>
Avatar billede tralala Nybegynder
19. juni 2012 - 13:24 #7
Svar fra udbyder:

"Der burde ikke være nogen problemer med at gemme session cookies, men de bliver selvfølgelig slettet hvis man går over på en anden side og lukker sessionen på selve siden ned.

Mange professionelle shop-systemer gør det at de gemmer alle sessions-informationerne i databasen under et specielt transaktionsid, inden brugeren bliver videresendt til betalingsgatewayen. Når betalingsgatewayen herefter sender brugeren tilbage til siden, bliver transaktionsid'et sendt med, og informationer om bestilte produkter osv. kan herefter hentes ned fra databasen i stedet for fra sessions cookien."

Giver det god mening? Bør jeg smide noget i en "fysisk" cookie eller database inden kunden går til betaling?
Avatar billede olebole Juniormester
19. juni 2012 - 13:36 #8
Allerførst skal du som sagt spørge brugeren, om du må sætte cookies på hans maskine. Det skal du også, når du logger hende ind - og hun skal spørges, hvergang der sættes en cookie med et nyt formål. Det siger både europæisk og dansk lovgivning.

Hvis du bruger løsningen med at gemme session oplysningerne i DB, skal du jo kunne genkende brugeren, når hun kommer tilbage fra betalingen. Derfor skal det omtalte transaktionsid sættes som cookie på klienten. Ellers kan du ikke genfinde hendes data, når hun kommer tilbage
Avatar billede erikjacobsen Ekspert
19. juni 2012 - 13:44 #9
Det er korrekt, at det kan være godt at gemme kundens varer i databasen. De skal jo være der alligevel, når han har betalt.

Men sessionen skal jo helst overleve alligevel.

For at undersøge min teori kan du lave 2 PHP-filer

  <?php session_start(); $_SESSION['paris']='hilton'; ?>

og

  <?php session_start(); print $_SESSION['paris']; ?>

Kald w w w.mitdomæne.dk/fil1.php (uden mellemrum) og derefter  mitdomæne.dk/fil2.php
og se hvad der skrives ud.
Avatar billede tralala Nybegynder
19. juni 2012 - 14:15 #10
Gik først til:
http://www.mitdomæne.dk/fil1.php (laver session)

Gik dernæst til:
mitdomæne.dk/fil2.php (skriver intet)

Gik dernæst til:
http://www.mitdomæne.dk/fil2.php (skriver hilton)

Så der er direkte funktionel (eller mangel på samme) forskel på med og uden www'erne.
Avatar billede tralala Nybegynder
19. juni 2012 - 14:16 #11
[ Ah, det var derfor du undlod at skrive www sammen heh. ]
Avatar billede erikjacobsen Ekspert
19. juni 2012 - 14:52 #12
Så hvis din kunde kommer ind på w w w.mitdomæne.dk, køber 1000 poser skumbananer, går til betaling, og kommer tilbage på mitdomæne.dk, så er hans session "væk".

Man kan med en vis ret sige, at dette er en fejlopsætning af sessions-cookierne i PHP. Man kunne også sige, at du skal sikre dig at kunden holder sig på samme subdomæne www eller uden.

Men udgangspunkt i det første, så prøv at tilføje i de to eksempler

  session_set_cookie_params ( 0, "/", ".mitdomæne.dk");

efter session_start() i de to eksempler. Skift helst 'paris' ud med 'london', så vi er sikre på at det er en ny test.
Avatar billede erikjacobsen Ekspert
19. juni 2012 - 15:06 #13
ups, før session_start()
Avatar billede tralala Nybegynder
19. juni 2012 - 15:10 #14
Jeg tror session_set_cookie_params skal sættes før session_start().

"Set cookie parameters defined in the php.ini file. The effect of this function only lasts for the duration of the script. Thus, you need to call session_set_cookie_params() for every request and before session_start() is called."

Men det gør ingen forskel. Jeg prøvede både med før og efter session_start(), og nu skriver fil2.php intet hverken med eller uden www'er.
Avatar billede tralala Nybegynder
19. juni 2012 - 15:10 #15
Heh ^^
Avatar billede erikjacobsen Ekspert
19. juni 2012 - 17:32 #16
Prøv følgende:

    http://www.n0p.com/964737a.php

og derefter

    http://n0p.com/964737b.php

Indholdet er henholdvis:

<?php
  session_set_cookie_params ( 0, "/", ".n0p.com");
  session_start();
  $_SESSION['paris']='hilton '.time();
  print "Setting: ".$_SESSION['paris'];
?>

(der er tilføjet time() så vi kan prøve flere gange)

<?php
  session_set_cookie_params ( 0, "/", ".n0p.com");
  session_start();
  print "Value: ".$_SESSION['paris'];
?>
Avatar billede tralala Nybegynder
20. juni 2012 - 09:50 #17
http://www.mitdomæne.com/964737a.php
Skriver: "Setting: hilton 1340178434"

mitdomæne.com/964737b.php
Skriver: "Value:"

http://www.mitdomæne.com/964737b.php
Skriver: "Value:"

Den skriver ikke det samme som din n0p gør.
Avatar billede erikjacobsen Ekspert
20. juni 2012 - 09:58 #18
Og det er lidt mærkeligt. Du har husket at udskifte domænet i koden til dit domæne..?

Hvis du kan lægge et link de to filer på din server, kan jeg kigge på hvad det rent faktisk er for cookies, der kommer.  (Det kan du også: fx webdeveloper udvidelse til firefox)
Avatar billede tralala Nybegynder
20. juni 2012 - 10:26 #19
Åh jeg klovn. Nej jeg havde netop overset dit n0p.

Nu skriver det:

http://www.mitdomæne.com/964737a.php
Skriver: "Setting: hilton 1340178434"

mitdomæne.com/964737b.php
Skriver: "Value: hilton 1340180733"

http://www.mitdomæne.com/964737b.php
Skriver: "Value: hilton 1340180733"
Avatar billede tralala Nybegynder
20. juni 2012 - 10:29 #20
[ Og den variere korrekt med tiden når jeg efterfølgende opdaterer. ]
Avatar billede tralala Nybegynder
20. juni 2012 - 12:04 #21
Jeg prøvede at sætte session_set_cookie_params ( 0, "/", ".mitdomæne.com"); ind på hhv. kassen.php og afslut.php, men ak, sessionen bliver stadigvæk ikke husket på afslut.php.
Avatar billede erikjacobsen Ekspert
20. juni 2012 - 12:40 #22
Øv. Jeg er ikke klar over det, men skal man ikke have det på alle sider, også de første gange du sætter en session...?

Det med at sætte den direkte på siderne er nok en nødløsning, men ok for vores eksperiment. Den bør sættes centralt på serveren - se fx http://www.php.net/manual/en/configuration.changes.php
Avatar billede tralala Nybegynder
20. juni 2012 - 14:45 #23
Jeg er ikke klar over det, men skal man ikke have det på alle sider, også de første gange du sætter en session...?

Kære Hr. Jacobsen,

Det tror jeg gjorde udslaget! Jeg har netop lavet 3 succesfulde testtransaktioner hvor jeg prøvede at fremprovokere fejl, men ingen kom :o)

Mange, mange tak for hjælp og episk tålmodighed ^^
Avatar billede erikjacobsen Ekspert
20. juni 2012 - 14:56 #24
Ja, det hjælper med tålmodighed, også i mange andre af livets udfordringer, for nu at sige det mildt.

Og Ole, sessions-cookier er generelt undtaget fra reglen om eksplicit tilladelse.
Avatar billede olebole Juniormester
21. juni 2012 - 23:07 #25
@Erik: Både og. Selve loven undtager ikke session-cookies, men vejledningen til loven foretager fejlagtige konklusioner - og undtager dem alligevel  =)

Lovens §4 definerer undtagelserne:

§ 4. Uanset § 3 kan fysiske eller juridiske personer lagre oplysninger
eller opnå adgang til oplysninger, der allerede er lagret, i en slutbrugers
terminaludstyr, hvis
1) lagringen af eller adgangen til oplysninger alene sker med det
formål at overføre kommunikation via et elektronisk kommunikationsnet,
eller
2) lagringen af eller adgangen til oplysninger er påkrævet for at
sætte tjenesteyderen af en informationssamfundstjeneste, som
slutbrugeren udtrykkelig har anmodet om, i stand til at levere
denne tjeneste.
Stk. 2. Lagring af eller adgang til oplysninger i en slutbrugers
terminaludstyr er påkrævet, jf. stk. 1, nr. 2, hvis lagringen af eller
adgangen til oplysninger er en teknisk forudsætning for at kunne levere
en tjeneste, der fungerer i overensstemmelse med tjenestens
formål.

I vejledningen skrives på s.12:

§ 4, stk. 2, uddyber, hvornår lagring af eller adgang til oplysninger i brugeres
terminaludstyr er påkrævet. Såfremt lagringen af eller adgangen til oplysninger
ikke er nogen teknisk forudsætning for at kunne levere en tjeneste (eller dele heraf),
der fungerer i overensstemmelse med tjenesten formål, kan undtagelsen ikke
anvendes.
Med hensyn til tjenestens formål, bør der lægges vægt på det formål, med hvilket
brugere tilgår tjenesten.

- fremhævelser stammer fra vejledningen

Lagringen af session-id'en skal altså være en påkrævet teknisk løsning for at være undtaget. Ikke desto mindre skrives der efterfølgende:

Undtagelsesbestemmelsen i § 4, stk. 1, nr. 2, finder eksempelvis anvendelse i
forbindelse med brugen af elektroniske indkøbskurve i webshops, hvor det er
nødvendigt at kunne genkende brugeren på tværs af sideskift (genindlæsninger af
webshoppen), da indkøbskurven ellers vil være tom ved visning af en ny side.
Lagring af fx en cookie eller lignende teknologi er dermed en teknisk forudsætning
for at kunne levere den tjeneste (e-handel), som brugeren udtrykkeligt har
anmodet om (tilgået webshoppen og lagt varer i indkøbskurven). Indkøbskurven
fungerer desuden i overensstemmelse med det formål (at købe varer), med hvilket
brugeren tilgår webshoppen.

Men session-id'er kan overføres via URL'en. De er derfor ikke en teknisk påkrævet løsning og burde således ikke være undtaget  =)
Avatar billede olebole Juniormester
21. juni 2012 - 23:09 #26
Avatar billede erikjacobsen Ekspert
21. juni 2012 - 23:21 #28
Session-id-er overført via URL holder ikke hvis brugeren undervejs besøger andre sider, for derefter at vende tilbage til siden med indkøbsvognen. I det tilfælde findes ingen anden metode end minimum session-cookies, så fordi brugeren forventer at genfinde sin indkøbskurv, så er det "strictly necessary".

Jeg tror jeg er gået glip af en masse ROFL fordi jeg ikke læste jura. Jurister virker kedelige og støvede, men de må have noget interessant "værkstedshumor".
Avatar billede olebole Juniormester
21. juni 2012 - 23:53 #29
#27: Skønt billede af livets dybere mening  =)

"- jamen, hvad sagde sømanden da så til nonnen?"

"*Muahahhaahaa-aa-hahaa* ... §47 stykke 3! **HarHarhahhaaaha**"

- nok ikke en værkstedshumor, jeg er helt kompatibel med  =)
Avatar billede erikjacobsen Ekspert
21. juni 2012 - 23:56 #30
Tak Ole. Det er lige blevet den bedste torsdag aften i den her uge. Go'nat ... ;-)
Avatar billede olebole Juniormester
22. juni 2012 - 00:04 #31
Du siger bare til - jeg har masser af dem. Sov godt  *D
Avatar billede olebole Juniormester
22. juni 2012 - 00:08 #32
PS: Jeg har en om §23, du ville elske - men den er næsten for stærk til at skrive i et offentligt forum. Det må blive en dag over en kølig flacon  :)
Avatar billede tralala Nybegynder
25. juni 2012 - 10:55 #33
Jeg vil tillade mig at lukke.
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