Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PHP] problemen met sessies en cookies, vooral in iframes

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleem met sessies (en cookies) waar geen logisch antwoord op lijkt te zijn. Het gaat om een systeem dat tussentijds e.e.a. wegschrijft in de database en inlogged, zodat de juiste gebruiker zijn of haar foto's, profiel, etc. kan toevoegen.

Er gebeurd helemaal niets spannend. Er wordt een emailadres opgeslagen en een hash (als test) gebaseerd op md5(time()). Deze schrijft ik naar de database en in een sessie. Op de volgende pagina wordt er gecontroleerd of de data in de sessies en de database overeenkomen.

Het probleem: in 20% van de gevallen komt de sessie niet overeen. Terwijl ze écht dezelfde bron hebben en direct na elkaar worden geschreven en opgehaald.
Nog een probleem: Bij ongeveer 2% wordt helemaal geen sessie geschreven.
Via een iFrame moet het formulier ook geladen worden. Maar hier is het foutpercentage nog hoger.

Ik heb het volgende geprobeerd:
- Tijdzone op de server goed gezet (stond niet goed).
- SessionTime verhoogd (was vrij kort).
- Alle vars, sessies e.d. gerenamed.
- Backup met cookies gemaakt (zelfde resultaat).
- Overal foutafhandeling (waaruit blijkt dat sessies dus verkeerd zijn, of gewoon niet opgeslagen worden).
- Etc.

Wat ik nog kan doen, maar na 12 uur trial en error, vraag ik toch maar eerst om advies.
- Ik gebruik P3P voor IE (iframe). Wellicht dat P3P verwijderen iets kan schelen.
- Random string ipv time(). Maar dat lost niet alles op.
- MD5 uitschakelen. Maar dat lost niet alles op.
- Via Google kwam ik tegen dat je UTF-8 moet encoden voor het schrijven naar de DB, aangezien dit gebeurd vóór de HTML headers aangeroepen worden. Mij lijkt dit niet helpen aangezien md5 volgens mij geen speciale karakters bevat.

Suggesties zijn welkom:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Verwijder alle sessies
$_SESSION = array();
session_destroy();
        
// Alle cookies verwijderen
setcookie('email', '', time() - 3600);
setcookie('hash', '', time() - 3600);

session_start();
$hashcode = md5(time());
// Inloggen (zet cookies en sessies)
$_SESSION["email"] = $emailadres;
$_SESSION["hash"] = $hashcode;
setcookie("email",$emailadres, time()+2440);
setcookie("hash",$hashcode, time()+2440);

// Hierna volgt een insert into, etc. waarbij alle data prima wordt opgeslagen.

  • Solopher
  • Registratie: December 2002
  • Laatst online: 30-10 12:28
--weg--

[ Voor 97% gewijzigd door Solopher op 29-01-2013 22:05 . Reden: Hmm sorry, verkeerd gelezen. ]


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Als de sessie niet overeen komt, wat gebeurd er dan? Is er geen sessie, of is het een andere valide sessie die je hebt gegenereerd (bijv. pagina die sessie destroyed/aanmaakt 2x geopend, willekeurige sessie-genererende pagina exact tegelijkertijd geopend)

setcookie 2x aanroepen in een pagina met dezelfde key lijkt mij niet handig; je stuurt maar 1x headers uit tenslotte.

En nog een stelling: in een goed ontworpen moderne website zitten geen iframes die naar dezelfde server verwijzen. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

Topicstarter
Pedorus > Haal die knipoog maar weg, ik ben het geheel met je iframe-opmerking eens :) Echter de klant wil het en ik heb niets in de pap te brokkelen op dat gebied..
setcookie 2x aanroepen in een pagina met dezelfde key lijkt mij niet handig; je stuurt maar 1x headers uit tenslotte.
Bedoel je het onderstaande? Na een tijdje ben ik met hagel gaan schieten en probeerde ik dat soort ongein uit.

PHP:
1
2
setcookie('email', '', time() - 3600); 
setcookie('hash', '', time() - 3600);
Als de sessie niet overeen komt, wat gebeurd er dan? Is er geen sessie (zie boven), of is het een andere valide sessie die je hebt gegenereerd (bijv. pagina die sessie destroyed/aanmaakt 2x geopend, willekeurige sessie-genererende pagina exact tegelijkertijd geopend)
Het wisselt, maar in 98% van de gevallen (even een ruwe gok) is er wel een sessie geschreven, maar is hij anders. De lengte e.d. komen wel overeen, het is een MD5 hash. Maar als ik simpelweg alle includes, pagina's, functies, objecten e.d. doorzoek, wordt er nergens een sessie met dezelfde naam geschreven. Het is ook sterk dat het dan soms goed gaat en soms niet.

  • dcm360
  • Registratie: December 2006
  • Niet online

dcm360

Moderator Discord

HD7767 powered

Verwijderd schreef op dinsdag 29 januari 2013 @ 22:11:
Pedorus > Haal die knipoog maar weg, ik ben het geheel met je iframe-opmerking eens :) Echter de klant wil het en ik heb niets in de pap te brokkelen op dat gebied..
De vraag is dan of de klant echt een iframe wil, of dat iets dat voor de bezoeker vergelijkbaar werkt ook voldoet. Dan zou je iets met AJAX kunnen doen (als het om hetzelfde domein gaat dan). Wat er wel en niet kan met iframes wisselt per browser en is ook nog afhankelijk van hoe strikt de beveiligingsinstellingen van de webbrowser zijn.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op dinsdag 29 januari 2013 @ 22:11:
Het wisselt, maar in 98% van de gevallen (even een ruwe gok) is er wel een sessie geschreven, maar is hij anders. De lengte e.d. komen wel overeen, het is een MD5 hash. Maar als ik simpelweg alle includes, pagina's, functies, objecten e.d. doorzoek, wordt er nergens een sessie met dezelfde naam geschreven. Het is ook sterk dat het dan soms goed gaat en soms niet.
Als je de sessie probeert te continueren dan gebruik je toch ook gewoon session_start(), wat een nieuwe sessie kan aanmaken? Kun je het probleem zelf reproduceren, of zie je alleen in logs dat dit gebeurd? Zo nee, dan zou je bijvoorbeeld met een packet capturer als Wireshark kunnen werken, of meer pagina's kunnen voorzien van session logging, zo'n md5 is toch redelijk uniek... ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

Topicstarter
@pedorus

Ik zelf heb nooit problemen, met geen enkele browser. Ik heb echter overal foutcontrole ingebouwd en krijg een mailtje met de info uit de cookies, sessies, etc. Daardoor kan ik zien dat ze soms niet matchen en dat dat de foutmelding veroorzaakt.

Sessionlogging ga ik eens kijken of dat lukt op een shared host. Hier lokaal werkt alles namelijk prima, maar ja, bij mij werkt het online ook prima. Dus heeft dat geen zin.

Andere vraag: Kan het iets met header("location:url"); te maken hebben na iedere pagina?
Of wellicht met https ipv http?

[ Voor 26% gewijzigd door Verwijderd op 30-01-2013 09:28 ]

Pagina: 1