Doncs utilitzar capçaleres HTTP. El servidor li indica al client que ha de crear una cookie amb Set-Cookie:
Set-Cookie:name=value
I a partir d'aquell moment i durant el temps de vida de la cookie el client ha d'afegir a cada HTTP Request la capçalera:
Cookie:name=value
Una session cookie o cookie de sessió aka in-memory cookie o transient cookie existeix només temporalment al navegador mentrestant l'usuari està logat és a dir que durpa el que dura una sessió. Aquest tipus de cookies es generen al iniciar una sessió i s'eliminen o al tancar el navegador (excepte que l'usuari hagui marcat i estigui implementada una opció/checkbox tipus "remember me") o quan l'usuari explícitament realitza un logout. Aquest tipus de cookies són les que generen per defecte comandes com setCookie (o les cookies de Laravel) per que són les que no tenen definida una expiration date. És a dir una cookie sense data d'expiració és una cookie de sessió.
Vegeu PHP Sessions i els articles Session i HTTP Session (a PHP el nom de la variable de sessió per defecte és PHPSESSID)
Són les cookies que no són de sessió i que expiren a una data determinada
httponly cookies An HttpOnly cookie cannot be accessed by client-side APIs, such as JavaScript. This restriction eliminates the threat of cookie theft via cross-site scripting (XSS). However, the cookie remains vulnerable to cross-site tracing (XST) and cross-site request forgery (XSRF) attacks. A cookie is given this characteristic by adding the HttpOnly flag to the cookie.
Laravel té les cookies amb httponly activades per defecte
Es pot modificar la configuració de Cookies a Laravel al fitxer:
config/session.php
Per exemple canviant:
'http_only' => false,
Resources
Es pot utilitzar l'opció secure amb la funció setCookie de PHP per forçar que una cookies només pot ser utilitzada en cas d'estar treballant amb HTTPS (i per tant amb HTTP sense seguretat no). Laravel porta aquesta configuració desactivada per defecte com podeu veure al fitxer:
config/session.php
Al paràmetre:
'secure' => env('SESSION_SECURE_COOKIE', false),
Com podeu veure l'entorn pot canviar la configuració establint la variable d'entorn SESSION_SECURE_COOKIE
NOTA: No confondre amb les cookies segures que són les que només s'utilitzent si està activat HTTPS
NOTA: És un sistema molt recomanable per emmagatzemar dades confidencials als clients com per exemple access tokens
Encrypted cookies es tracta d'una tècnica que permet emmagatzemar les cookies xifrades per proveir de més seguretat/confidencialitat a les cookies. Sovint és el servidor el que xifra la cookie amb un sistema de clau asimètrica de forma que només el servidor pugui accedir a la informació que conté la cookie
Laravel per defecte encripta les cookies quan estem treballant al web group middleware utilitzant el Middleware EncryptCookies
\App\Http\Middleware\EncryptCookies
Si observeu el codi ens permet indicar excepcions (cookies que no volem xifrar) i si observeu el Service Provider
Illuminate\Cookie\CookieServiceProvider
Que com podeu veure utilitzar el encriptador establert a
Illuminate\Encryption\EncryptionServiceProvider
Per tant totes les cookies van xifrades amb AES-256-CBC que és el cipher establert al fitxer config/app.php . Cal tenir en compte com utilitzem l'encriptació:
Vegeu també Cookies i Seguretat
SameSite cookie TODO
Google Chrome 51 recently introduced[15] a new kind of cookie which can only be sent in requests originating from the same origin as the target domain. This restriction mitigates attacks such as cross-site request forgery (XSRF).[16] A cookie is given this characteristic by setting the SameSite flag to Strict or Lax.[17]
Normally, a cookie's domain attribute will match the domain that is shown in the web browser's address bar. This is called a first-party cookie. A third-party cookie, however, belongs to a domain different from the one shown in the address bar. This sort of cookie typically appears when web pages feature content from external websites, such as banner advertisements. This opens up the potential for tracking the user's browsing history, and is often used by advertisers in an effort to serve relevant advertisements to each user. As an example, suppose a user visits www.example.org. This web site contains an advertisement from ad.foxytracking.com, which, when downloaded, sets a cookie belonging to the advertisement's domain (ad.foxytracking.com). Then, the user visits another website, www.foo.com, which also contains an advertisement from ad.foxytracking.com, and which also sets a cookie belonging to that domain (ad.foxytracking.com). Eventually, both of these cookies will be sent to the advertiser when loading their advertisements or visiting their website. The advertiser can then use these cookies to build up a browsing history of the user across all the websites that have ads from this advertiser. As of 2014, some websites were setting cookies readable for over 100 third-party domains.[18] On average, a single website was setting 10 cookies, with a maximum number of cookies (first- and third-party) reaching over 800.[19] Most modern web browsers contain privacy settings that can block third-party cookies.
A supercookie is a cookie with an origin of a top-level domain (such as .com) or a public suffix (such as .co.uk). Ordinary cookies, by contrast, have an origin of a specific domain name, such as example.com. Supercookies can be a potential security concern and are therefore often blocked by web browsers. If unblocked by the browser, an attacker in control of a malicious website could set a supercookie and potentially disrupt or impersonate legitimate user requests to another website that shares the same top-level domain or public suffix as the malicious website. For example, a supercookie with an origin of .com, could maliciously affect a request made to example.com, even if the cookie did not originate from example.com. This can be used to fake logins or change user information. The Public Suffix List[20] helps to mitigate the risk that supercookies pose. The Public Suffix List is a cross-vendor initiative that aims to provide an accurate and up-to-date list of domain name suffixes. Older versions of browsers may not have an up-to-date list, and will therefore be vulnerable to supercookies from certain domains. Other uses The term "supercookie" is sometimes used for tracking technologies that do not rely on HTTP cookies. Two such "supercookie" mechanisms were found on Microsoft websites in August 2011: cookie syncing that respawned MUID (machine unique identifier) cookies, and ETag cookies.[21] Due to media attention, Microsoft later disabled this code.[22]
A zombie cookie is a cookie that is automatically recreated after being deleted. This is accomplished by storing the cookie's content in multiple locations, such as Flash Local shared object, HTML5 Web storage, and other client-side and even server-side locations. When the cookie's absence is detected, the cookie is recreated using the data stored in these locations.
Es poden utilitzar les funcions:
Com que realment el que fan aquestes comandes és afegir un capçalera HTTP (vegeu els apartats anteriors) aleshores cal vigilar de crida aquestes funcions abans de generar cap contingut de sortida per evitar l'error:
Headers already sent
o utilitzar les funcions de PHP de output buffering
Per recuperar les cookies només cal utilitzar la variable superglobal de PHP:
$_COOKIE
Per exemple per recuperar la Cookie userId:
$_COOKIE['userId']
Resources:
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
Resources:
https://laravel.com/docs/5.3/requests#cookies
La configuració de les cookies es realitza al fitxer:
config/session.php
bàsicament permet indicar el domini de les cookies, si seran cookies segures (desactivat per defecte) i httponly cookies (activat per defecte).
Llegir cookies utilitzant objecte $request:
$value = $request->cookie('name');
Escriure una cookie amb objecte $response:
return response('Hello World')->cookie( 'name', 'value', $minutes );
O completament configurable passant les dades a setCookie
return response('Hello World')->cookie( 'name', 'value', $minutes, $path, $domain, $secure, $httpOnly );
Si indiquem 0 als minuts aleshores establim una cookie de sessió (durarà el que duri la sessió)
De fet el més sovint serà combinar-ho amb l'ús de vistes, 2 opcions:
$response = new \Illuminate\Http\Response(view('welcome')); $response->withCookie(cookie('prova', 'value'));
O utilitzar les Cuas de cookies
NOTA: Les cookies en cua funcionen pel midleware \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse
opció 1
Cookie::queue(Cookie::make("provacookielaravel","Sergi TUR Badenas")); return view('home');
opció 2
use Illuminate\Cookie\CookieJar; public function index(CookieJar $cookieJar, Request $request) { if($request->referrer){ $cookieJar->queue(cookie('referrer', $request->referrer, 45000)); } return view('welcome'); }
També tenim disponible la facade Cookie:
Illuminate\Support\Facades\Cookie
Que tenen els mètodes estatics:
Cookie:has('cookietotest') : comprova si una cookie està establerta Cookie:get(cookiename) : obté una cookie
I finalment també tenim el laravel helper és a dir la funció cookie
https://laravel.com/docs/5.3/helpers
function cookie($name = null, $value = null, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true)
Que permet crear una cookie.
NOTA: Operacions bàsiques com obtenir el valor d'una cookie concreta no són possibles sense funcions a mida en Javascript! Vegeu js-cookie
Per crear una cookie podem executar:
document.cookie = "username=John Doe";
En aquest cas no hem definit cap temps de caducitat per a la Cookie. El valor per defecte es que la cookie caducarà al tancar el navegador. Per definir el temps de caducitat:
document.cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC";
Per obtenir totes les cookies:
var cookies = document.cookie;
function setCookie(cname, cvalue, exdays) { var d = new Date(); d.setTime(d.getTime() + (exdays*24*60*60*1000)); var expires = "expires="+ d.toUTCString(); document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; }
Són o poden ser subsceptibles a atacs com:
Recursos:
Un exemple de com ho fa una web oficial:
http://www.minetur.gob.es/industria/RAEE/Paginas/Index.aspx
http://sitebeam.net/cookieconsent/
Tingueu en compte que les cookies poden ser establertes com httponly (es bastant habitual) pel fet que les aplicacions web de part del servidor creen cookies que no volen poder ser modificades per Javascript per evitar que un forat de seguretat al navegador pugui esdevenir en un error de seguretat al servidor.