Scripts
Zelf koekjes bakken
Iedereen weet dat de koekjes die je zelf bakt het lekkerst smaken. Daarom een lekker recept voor je eigen koekjes. En een recept om nog niet verzonden koekjes zelf op te eten. Voor wanneer je wilt kunnen volgen hoe het nu eigenlijk werkt, en als je wilt kunnen variëren op het recept. Ingrediënten: - één call naar header() - één string volgens RFC 6265 Bereidingtip voor eigen consumptie: - headers_sent(), headers_list() en header_remove() Toen OWASP aangaf dat het Same-site attribuut veiliger was en PHP 7.2 dat nog niet had in setcookie() en setrawcookie() is het script gemaakt. Met een extra functie voor het verwijderen van nog niet verzonden cookies, wanneer output buffering aan staat.
koekjesbakken.php
<?
/**
* Schrijf cookie
* @note als setcookie() met Same-Site attribuut
* @param string $sNaam
* @param string $sInhoud
* @param int $iLevensduur in seconden
* @return void
*/
function schrijfCookie(string $sNaam, string $sInhoud, int $iLevensduur) {
header('Set-Cookie: '
. urlencode($sNaam) . '=' . urlencode($sInhoud)
. '; Max-Age=' . ((string) abs($iLevensduur))
// . '; Domain=' // optioneel, default is huidige domein
. '; Path=/'
. ((isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] !== 'off')
? '; Secure' // FF negeert dit bij HTTP, IE11 niet
: ''
)
. '; HttpOnly'
. '; SameSite=Strict');
}
/**
* Wis cookie
* @return void
*/
function wisCookie(string $sNaam, string $sInhoud) {
// wis evt. cookie in browser
if (!headers_sent()) {
$sCookie = sprintf(' %s=', urlencode($sNaam));
$sCookieInh = sprintf('%s%s;', $sCookie, urlencode($sInhoud));
$bCookie = FALSE;
$aCookie = []; // andere cookies
foreach (headers_list() as $sHeader) {
if (0 !== stripos($sHeader, 'Set-Cookie:')) {continue;}
if (11 === strpos($sHeader, $sCookie, 11)) {
$bCookie = TRUE;
if (11 !== strpos($sHeader, $sCookieInh, 11)) {$aCookie[] = $sHeader;}
} else {$aCookie[] = $sHeader;}
}
if ($bCookie) {
header_remove('Set-Cookie'); // niet vervangen, alle cookies sturen
foreach ($aCookie as $sHeader) {header($sHeader, FALSE);}
}
else {$this->schrijfCookie($sNaam, '', 0);} // 0 = tot browser sluit
}
}
Reacties
0