Het is belangrijk om cookies die jouw website zet te beveiligen. Twee van zulke beveiligingsmechanismen zijn: httpOnly en RequireSSL. Hier leg ik je uit hoe je dit gebruikt in jouw webapplicatie (ASP.NET, ASP, PHP).

HttpOnly cookies kunnen alleen door middel van een HTTP-verzoek opgevraagd en gelezen worden. Dat betekent dat een stukje JavaScript dat in jouw website draait niet een cookie kan uitlezen met document.cookie. Dit is goed, want dan kan een kwaadaardig JavaScript er niet bij.

Secure (of RequireSSL) vereist zelfs een SSL-verbinding met de website.

ASP.NET

In ASP.NET dwing je HttpOnly en Secure af in een web.config-bestand. Saillant detail, ondanks dat men altijd spreekt over de flag Secure noemt ASP.NET dit RequireSSL.

Neem in het web.config-bestand op:

<httpCookies httpOnlyCookies="true" />

Heb jij een SSL-certificaat bij jouw hostingpakket? Dan is het belangrijk dat erbij op te geven in het web.config-bestand. Gebruik dan:

<httpCookies httpOnlyCookies="true" requireSSL="true" />

Gebruik optioneel domain="" om een geldend domein voor het cookie in te stellen. Dan geldt het cookie alleen voor die domeinnaam:

<httpCookies
 httpOnlyCookies="true"
 requireSSL="true"
 domain="example.com" />

Plaats dit in de <system.web> node van het web.config-bestand.

Je vindt alle relevante informatie in de HttpCookie Class documentatie (MSDN) en HttpCookiesSection Class (Microsoft Docs).

Classic ASP

Met classic ASP kun je de flags HttpOnly en RequireSSL/Secure alleen zetten d.m.v IIS URL Rewrite.

In plaats van bovenstaande <httpCookies httpOnlyCookies="true" /> voeg je dan het volgende toe in jouw web.config-bestand:

<rewrite>
<outboundRules>
<rule name="Add HttpOnly">
<match serverVariable="RESPONSE_Set_Cookie" pattern=".*" />
<conditions>
<add input="{R:0}" pattern="; HttpOnly" negate="true" />
</conditions>
<action type="Rewrite" value="{R:0}; HttpOnly" />
</rule>
<rule name="Add Secure">
<match serverVariable="RESPONSE_Set_Cookie" pattern=".*" />
<conditions>
<add input="{R:0}" pattern="; Secure" negate="true" />
</conditions>
<action type="Rewrite" value="{R:0}; Secure" />
</rule>
</outboundRules>
</rewrite>

Deze rewrites hebben als voordeel dat ze ook werken voor andere code. Dus kom je er met het ASP.NET stuk even niet uit, probeer dan deze. Hetzelfde geldt voor PHP, mits jouw website wordt gehost op Windows Server IIS.

PHP

Dat de PHP functie set_cookie() de Secure en HttpOnly flags al kan meegeven weet je hopelijk. Maar als je niet weet of een CMS waarvan jij gebruik maakt dit goed doet, en je niet alle code wilt controleren, dan kun je dit eenvoudig afdwingen.

Op Windows Server IIS webservers plaats je een user-defined .ini-bestand met hierin:

session.cookie_httponly = 1
session.cookie_secure = 1

Informeer bij je hostingprovider wat de naam moet zijn van het user-defined .ini-bestand.

De onderstaande .htaccess regel en bovengenoemde URL Rewrite kun je ook gebruiken.

Secure cookie met HttpOnly and Secure flag in Apache .htaccess

Om veilige cookies met HttpOnly en Secure af te dwingen in Linux Apache webservers plaats je een .htaccess-bestand met daarin:

Header edit Set-Cookie ^(.*)$ "$1; HTTPOnly"
Header edit Set-Cookie ^(.*)$ "$1; Secure"

Eventueel kun je het bovengenoemde php.user.ini hier ook voor gebruiken.

session.cookie_samesite [string]

Hiermee vertel je de server dat cookies niet in verkeer tussen websites gebruikt mogen worden, maar alleen op de desbetreffende website zelf. Er zijn hierbij drie standen:

  • Geen waarde: Hiermee wordt de waarde uitgeschakeld, ook als het in de php.ini is ingeschakeld.
  • Lax: Bij GET-opdrachten tussen websites wordt wel een cookie geserveerd, maar niet bij POST-opdrachten.
  • Strict: Er wordt in het geheel geen cookie geserveerd bij GET- of POST-opdrachten tussen sites.

Niet elke browser respecteert deze instelling. Bij de meest gebruikte browsers is de ondersteuning wel aanwezig in de recente versies.

Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *