Hein Pragt Pragt.info    © Hein Pragt ( Facebook ,  )  
 

Http cookies

© 2006 Hein Pragt

De laatste jaren is er veel ophef over cookies op Internet. Een cookie is een (kleine) hoeveelheid data die een internetserver naar de webbrowser stuurt met de bedoeling dat deze opgeslagen wordt en bij een volgend bezoek weer naar de webserver teruggestuurd wordt. Zo kan de webserver (applicatie) bijhouden wat de gebruiker (de webbrowser) in het verleden heeft gedaan. Vanwege de privacyaspecten is het gebruik van cookies soms omstreden.

Introductie in Http cookies

Introductie in Http cookies Cookies zijn kleine stukjes (tekst) informatie die een server naar de browser stuurt met de bedoeling dat de browser deze informatie bij een volgend bezoek deze informatie weer naar de server terug zal sturen. Aangezien HTTP (het Internet protocol waarmee browsers verzoeken kunnen sturen naar servers en servers data terug kunnen sturen naar browsers) zogenaamd 'stateless' is, is na ieder verzoek en reactie van de webserver de transactie afgesloten en elk ander nieuw verzoek zal een nieuwe transactie zijn. Kortom de webserver weet niet dat er relaties zijn tussen verschillende verzoeken om een pagina of data. Dit kan lastig zijn als u bijvoorbeeld aan het telebankieren bent wilt u niet bij iedere pagina opnieuw inloggen. Er zijn twee methodes om relaties te leggen tussen HTTP verzoeken.

De eerste is een sessie variabele aan elke link koppelen zodat de webserver kan zien dat het verzoek een samenhang heeft met een eerder verzoek. De tweede methode is het gebruiken van een cookie. Bij het eerste verzoek om een pagina zal de server een cookie naar de browser sturen, die deze zal opslaan. Omdat bij ieder nieuw verzoek van de browser (onzichtbaar voor de gebruiker) de naam en inhoud van de cookie naar de server verzonden zal worden, kan de server een samenhang met een eerder verzoek vaststellen. Op de webserver zal de data van de verschillende verzoeken in een bestandje of in het geheugen bewaard worden (sessie data) waardoor het lijkt alsof de browser gebruiker een samenhangende verbinding heeft met de webserver.

Een groot nadeel van cookies is echter dat deze informatie ook privé kan zijn en reclame bedrijven deze cookies misbruikt hebben om informatie over het surfgedrag van de gebruiker vast te leggen. Met de huidige browsers en cookie technologie is dit misbruik echter bijna niet meer mogelijk. U kunt uw browser zo instellen, dat u wordt gewaarschuwd voor cookies, zodat u kunt kiezen of u de cookie wel of niet wilt accepteren. Soms hebt u geen toegang tot een webpagina als u de cookie niet accepteert. Een cookie kan niet worden uitgevoerd als code en het kan geen virussen verspreiden, is uniek en kan alleen worden gelezen door de webserver die u de cookie heeft gegeven.

Geschiedenis van Http cookies

Cookies zijn voor het eerst in Netscape 1.0 geïntroduceerd, Internet Explorer ondersteunde cookies pas vanaf versie 3. Cookies werden pas zichtbaar voor Internetgebruikers toen in Netscape 3 een optie kwam die gebruikers in staat stelde om gewaarschuwd te worden wanneer er geprobeerd werd een cookie te plaatsen.

Advertentiebureaus ontdekten het cookie ook en gingen het misbruiken voor het bijhouden van surfgedrag. In 1997 kwam er een voorstel dat browsermakers aanmoedigde om het gebruik van cookies inzichtelijker te maken voor de gebruiker. Het gevolg hiervan was dat de gebruiker vanaf toen kon instellen welke cookies geaccepteerd mogen worden.

Cookies kwamen in opspraak toen een bekend Internet advertentiebureau DoubleClick een bedrijf overnam met een grote klantendatabase. DoubleClick wilde de naamsgegevens koppelen aan de profielen van surfers en was van plan deze gegevens te verkopen. Onder druk van verschillende privacy organisaties heeft DoubleClick de gegevens niet verkocht.

In 2002 is de eerste P3P recommendation www.w3.org/TR/P3P gepubliceerd door de W3C. Browsers die zich aan deze specificatie houden, accepteren standaard veel minder cookies. De gebruiker kan desgewenst de instellingen van de browser aanpassen.

Specificaties Http cookies

(vertaling oorspronkelijke specificatie van Netscape)

Een cookie zal naar de client (browser) verzonden worden als een Set-Cookie header als onderdeel van een HTTP response. Meestal zal de cookie door een CGI script gegenereerd worden.

Syntax van de Set-Cookie HTTP Response Header

Dit is het formaat van de data die een CGI script kan toevoegen aan de HTTP headers om een stukje data naar de client (browser) te sturen om deze op een later tijdstip weer terug te ontvangen.

Set-Cookie: NAME=waarde; expires=datum; path=pad; domain=naam; secure

NAME=waarde
Dit is het enige verplichte attribuut van de Set-Cookie header.
Deze tekenreeks is een opeenvolging van karakters exclusief puntkomma, komma, spaties en tabs. Als er een behoefte is om dergelijke tekens in de naam of de waarde te plaatsen, is de codeer methode zoals URL stijl %XX de aanbevolen methode, hoewel de wijze van coderen niet bepaald of vereist is.

expires=datum (optioneel)
Dit is een optioneel attribuut, wanneer het niet aanwezig is zal de cookie verlopen als de client sessie afgelopen is, lees de browser afgesloten is. Het expires attribuut specificeert een datum tekenreeks die de geldige levensduur van dat cookie bepaalt. Zodra de vervaldatum is bereikt, zal het koekje niet meer opgeslagen worden of naar de server verzonden worden.
Het datum format is:

Wdy, DD-Mon-YYYY HH:MM:SS GMT

Dit is gebaseerd op RFC 822, RFC 850, RFC 1036, and RFC 1123, met als enige aanpassing dat de enige geldige tijdzone GMT is en de scheidingtekens tussen de elementen streepjes moeten zijn.

domain=naam (optioneel)
Wanneer de client (browser) zal zoeken in de cookie lijst naar geldige cookies, wordt een vergelijking van de domeinattributen van het koekje gemaakt met de 0 domeinnaam van de Internet host waar het verzoek naar toe gaat. Wanneer er vanaf het einde van de URL een gelijkenis is op domeinnaam, dan zal het pad dat achter de domeinnaam staat vergeleken worden. Vergelijken vanaf het einde van het domein betekent dat het domeinattribuut met het einde van de volledig gekwalificeerde domeinnaam van de gastheer wordt vergeleken. Een domeinattribuut van "acme.com zou" een correcte vergelijking opleveren voor "anvil.acme.com" en "shipping.crate.acme.com".
In de naam moeten minimaal 3 punten voorkomen, alleen Internet host computers in een select aantal toplevel domeinen mogen minimaal 2 punten in de naam hebben. De volgende 7 toplevel domeinen mogen 2 punten hebben, "COM", "EDU", "NETTO", "ORG", "REGERING", "MIL", en "INT". De standaardwaarde van domein naam is de hostnaam van de server die het cookie verzoek produceerde.

path=pad (optioneel)
Het pad attribuut wordt gebruikt om een ondergroep van URLs in een domein te specificeren waarvoor het koekje geldig is. Als een koekje al op domein niveau valide is, dan wordt het pad component van URL vergeleken. Wanneer deze ook overeenkomt wordt het koekje beschouwd als geldig en samen met het verzoek verzonden. Het pad "/foo" zou matchen met "/foobar" en "/foo/bar.html". Pad "/" is de meest algemene weg en geeft een correct vergelijk op alle onderliggende paden. Als het pad niet wordt gespecificeerd dan zal het pad uit de header die de cookie verstuurd overgenomen worden.

secure (optioneel)
Als een koekje de markering secure heeft zal het alleen verzonden worden door de client (browser) wanneer de verbinding veilig is. Momenteel betekent dit dat de veilige koekjes slechts zullen verzonden worden naar (http over ssl) servers. (https). Wanneer secure niet wordt gespecificeerd zal de cookie zowel over veilige als niet veilige kanalen verzonden worden.

Syntax van de Cookie HTTP Request Header

Wanneer een HTTP verzoek naar een Internet host gaat zullen er extra headers meegezonden worden wanneer de cookie vergelijking overeenkomt. Per cookie zal de naam en waarde meegezonden worden. Hier is het formaat van een cookie header regel:

Cookie: NAME1=STRING1; NAME2=STRING2

Aanvullende informatie:

  • Meerdere Set-Cookie headers kunnen verzonden worden in één enkele server response.
  • Cookies met hetzelfde pad zullen elkaar overschrijven, de meest recente versie zal gebruikt worden. Instanties van hetzelfde pas met verschillende namen zullen verschillend opgeslagen worden. Het plaatsen van cookie met een korter pad dat overlapt met een meer specifiek pad zal geen invloed hebben op de eerder verzonden cookie. Wanneer een pagina opgevraagd zal worden met het specifieke pad en het kortere pad matched ook op het eerste deel van het specifieke pad, zullen beide cookies verzonden worden. Het expires attribuut geeft aan wanneer de cookie verwijderd mag worden, de client (browser) hoeft dit niet te doen en mag de cookie ook verwijderen als bijvoorbeeld het maximale aantal cookies overschreden is.
  • Wanneer meerdere cookies naar de server verzonden worden zal de cookie met de meest specifieke match als eerste verzonden worden. Wanneer er dus een cookie is met een pad '/' en een cookie met pad '/foo' zal op de pagina ',/foo' eerst de cookie met het pad '/foo' en daarna de cookie met het pad '/' verzonden worden.
  • Er zijn beperkingen op het aantal koekjes dat een cliënt op een gegeven moment kan opslaan. Dit is een specificatie van het minimumaantal koekjes dat een cliënt zou moeten kunnen ontvangen en opslaan.
    • 300 cookies in totaal.
    • 4 kilobytes per cookie.
    • 20 cookies per server of domein.
    Server moeten er van vanuit gaan dat clients (browsers) deze grenzen kunnen overschrijden. Wanneer de 300 cookie grens of de 20 cookies per server grens is overschreden zullen clients (browsers) de minst recente cookie verwijderen. Wanneer een cookie groter is dan 4 kilobytes zal de cookie wel opgeslagen worden maar dan afgebroken op deze 4 kilobyte grens. Wanneer een script een cookie wil verwijderen dient deze een cookie verzoek te sturen met exact dezelfde naam en pad en een tijd in het verleden.
  • Wanneer http gecached zal worden, bijvoorbeeld in een proxy server moet een Set-Cookie opdracht nooit gecached worden.
  • Een proxy server dient een Set-cookie reactie altijd door te sturen ook als het server antwoord 304 (Not Modified) of 200 (OK) is.


Cookies in PHP

setcookie (PHP 3, PHP 4, PHP 5)

Beschrijving:

boolean setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]] )

setcookie() defineert een cookie dat wordt meegezonden met de rest van de header informatie. Zoals elke header moeten cookies verzonden worden voordat er output verzonden wordt vanuit uw script (dit is een restrictie van het protocol). Daarom moet u deze functie aanroepen voor enige output, zoals <html> of <head> tags en whitespace. Als er toch output wordt doorgegeven voor het aanroepen van deze functie, dan zal setcookie() falen en FALSE terug geven. Als alles goed is gegaan, geeft hij TRUE terug. Dit wil echter niet zeggen dat de gebruiker het cookie geaccepteerd heeft.

Alle argumenten behalve de name parameter zijn optioneel. Als alleen het name argument aanwezig is, wordt het cookie met die naam verwijderd van de remote client. U mag een willekeurig argument ook vervangen door een lege string ("") om dat argument over te slaan. De expire en secure argumenten zijn integers en kunnen niet worden overgeslagen met een lege string. Gebruik in plaats daarvan een nul (0). De expire parameter is een normaal Unix tijds integer zoals wordt teruggegeven door de time() of mktime() functies. De secure geeft aan dat het cookie alleen mag worden verzonden over een veilige HTTPS verbinding.

Wanneer cookies eenmaal zijn ingesteld, kunnen ze worden opgeroepen op de volgende pagina met de $_COOKIE of $HTTP_COOKIE_VARS array. Let op dat autoglobals zoals $_COOKIE vanaf PHP 4.1.0 pas aanwezig zijn. $HTTP_COOKIE_VARS bestaat al vanaf PHP 3.

Veel voorkomende fouten:

Cookies worden niet zichtbaar tot de volgende keer dat een pagina waarop het cookie zichtbaar is wordt geladen. Om te testen of een cookie succesvol is meegegeven, controleer dan voor cookies bij het laden van de pagina voor de cookie verloopt. De verlooptijd kunt u instellen met de expire parameter.

Cookies moeten worden verwijderd met dezelfde parameters als waarmee ze werden ingesteld.

Cookie namen kunnen aangegeven zijn als array namen en zullen dan aanwezig zijn in uw PHP scripts als array, maar worden bij de gebruiker als aparte cookies opgeslagen. Overweeg explode() of serialize() om één cookie te gebruiken die meerdere namen en waardes bevat.

In PHP 3 worden meerdere aanroepen van setcookie() in hetzelfde script verwerkt in omgekeerde volgorde. Als u probeert een cookie te verwijderen voordat u een nieuwe neerzet, moet u het toevoegen doen voor het verwijderen. In PHP 4 worden meerdere aanroepen van setcookie() verwerkt in de volgorde waarop ze worden aangeroepen.

Een paar voorbeelden volgen over hoe u cookies kunt verzenden:

Voorbeeld 1. setcookie() stuur voorbeelden

setcookie ("TestCookie", $value);
setcookie ("TestCookie", $value,time()+3600);  /* verloopt in 1 uur */
setcookie ("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);  

Wanneer u een cookie verwijdert moet u zorgen dat de expire datum in het verleden is, om het verwijder mechanisme in de browser te activeren. Er volgen voorbeelden hoe u in het vorige voorbeeld verzonden cookies kunt verwijderen:

Voorbeeld 2. setcookie() verwijder voorbeelden

// zet de verlooptijd naar 1 uur in het verleden
setcookie ("TestCookie", "", time() - 3600);
setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);  

Let er op dat het waarde deel van het cookie automatisch wordt ge-urlencoded wanneer u het cookie verzendt, en wanneer het wordt ontvangen, wordt het automatisch gedecodeerd en toegewezen aan een variabele met dezelfde naam als de cookie naam. Om de inhoud van ons test cookie in een script te zien, kunt u simpelweg een van de volgende voorbeelden gebruiken:

echo $TestCookie;
echo $_COOKIE["TestCookie"];  

U kunt ook array cookies zetten door array notatie in de cookie naam te gebruiken. Dit heeft het effect dat er evenveel cookies worden neergezet als u array elements hebt, maar als het cookie wordt ontvangen door uw script worden de waarden allemaal geplaatst in een array met de naam van het cookie:

setcookie ("cookie[three]", "cookiethree");
setcookie ("cookie[two]", "cookietwo");
setcookie ("cookie[one]", "cookieone");
if (isset ($cookie)) {
   while (list ($name, $value) = each ($cookie)) {
       echo "$name == $value<br>\n";
   }
}  


Last update: 23-05-2011



Disclaimer.

Hoewel de heer Hein Pragt de informatie beschikbaar op deze pagina met grote zorg samenstelt, sluit de heer Pragt alle aansprakelijkheid uit met betrekking tot de informatie die, in welke vorm dan ook, via zijn site wordt aangeboden. Het opnemen van een afbeelding of verwijzing is uitsluitend bedoeld als een mogelijke bron van informatie voor de bezoeker en mag op generlei wijze als instemming, goedkeuring of afkeuring worden uitgelegd, noch kunnen daaraan rechten worden ontleend.
Op de artikelen van de heer Pragt op deze Internetsite rust auteursrecht. Overname van informatie (tekst en afbeeldingen) is uitsluitend toegestaan na voorafgaande schriftelijke toestemming van de rechthebbende. Voor vragen over copyright en het gebruik van de informatie op deze site kunt u contact opnemen met: (email: mail@heinpragt.com)

Webdesign: © Hein Pragt
Fotografie: © Hein Pragt
Auteur: © Hein Pragt (Veenendaal - Utrecht - Nederland)