Http cookies
| Informatie over Http cookies |
© 2006 Hein Pragt
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
|