IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Explicació i història

Com es transporten les cookies mitjançant HTTP?

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

Tipus de cookies

Session cookie

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)

Persistent cookie

Són les cookies que no són de sessió i que expiren a una data determinada

httponly

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

secure cookies

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

Encrypted cookies

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ó:

  • La encriptació proporciona confidencialitat i no pas altres funcionalitats com l'autenticació
  • La encriptació de per si no és una forma de proveir autenticació ja que per exemple el fet que xifrem una paraula de pas (o en fem un hash) impedeix a un atacant coneixer la paraula de pas però no impedeix la suplantació de identitat (simplement utilitzant la paraula de pas xifrada per entrar com l'usuari).
  • Als sistemes de xifratge amb clau asimètrica podem utilitzar el concepte de signar per verificar l'autenticitat d'un missatge i per tant per autenticar correctament però cal no confondre xifratge amb signar tot i que siguin conceptes relacionats. Una alternativa interessant és JWT o Json Web Tokens
  • Pot ser útil xifrar cookies si utilitzem HTTPS? Sí HTTPs només protegeix de tercers però no protegeix al servidor del propi client ja sigui per males intencions del propi client o per vulnerabilitats en el client que puguin explotar tercers. Al xifrar el contingut de la cookie el fem accesible només per al servidor
  • No confongueu xifratge amb hash o creació de tokens i/o uuids. Per exemple els identificadors de sessió que se solen guardar en cookies per a implementar la sessió (vegeu PHP Session) solen fer un hash o contenir un token per identificar el client de forma que no sigui senzill esbrinar el identificador d'usuari i per tant no sigui senzill aconseguir un atac de session hijacking

Vegeu també Cookies i Seguretat

SameSite cookie

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]

Third-party cookie

Third-party cookie

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.

Supercookie

Supercookie

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]

Zombie cookie

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.

PHP

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:

setcookie

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
  • name: The name of the cookie.
  • value: The value of the cookie. This value is stored on the clients computer; do not store sensitive information. Assuming the name is 'cookiename', this value is retrieved through $_COOKIE['cookiename']
  • expire: unix timestamp. Per defecte sinó s'indica res les cookies caduquen al tancar el navegador (o al ser esborrades especificament)
  • domain: The (sub)domain that the cookie is available to. Setting this to a subdomain (such as 'www.example.com') will make the cookie available to that subdomain and all other sub-domains of it (i.e. w2.www.example.com). To make the cookie available to the whole domain (including all subdomains of it), simply set the value to the domain name ('example.com', in this case). Older browsers still implementing the deprecated » RFC 2109 may require a leading . to match all subdomains.
  • secure: Si es marca com a true indica que la cookie només es pot establir si s'està utilitzant HTTPS
  • httponly: Vegeu httponly cookie. Indica que només és accesible via HTTP és a dir que no podrà ser accessible utilitzant Javascript. Això ajuda a evitar atacs XSS. Laravel per defecte crea les cookies amb httponly activat.

Resources:

Laravel Cookies

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.

Javascript

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=/";
}

js-cookie

Cookies i seguretat

Són o poden ser subsceptibles a atacs com:

Recursos:

Nova normativa española informació Cookies

Un exemple de com ho fa una web oficial:

http://www.minetur.gob.es/industria/RAEE/Paginas/Index.aspx

cookieconsent de sitebeam

http://sitebeam.net/cookieconsent/


Troubleshooting. Resol·lució de problemes

No es pot accedir a les cookies via Javascript (amb Laravel)

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.

Vegeu també

Enllaços externs