# Les cookies

Les **cookies** en PHP són una eina fonamental per gestionar l'estat en el protocol HTTP (que és sense estat). Una *cookie* és un petit fragment de dades (un parell clau-valor) que un servidor envia al navegador web de l'usuari. El navegador l'emmagatzema i la retorna al servidor amb cada petició posterior, permetent que el servidor "recordi" l'usuari o les seves preferències.

## Funcionament de les Cookies en PHP

El procés de creació i ús d'una *cookie* amb PHP es basa en la comunicació mitjançant **capçaleres HTTP**:

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-creaci%C3%B3-%28servidor-a-" inline-copy-host="">1. **Creació (Servidor a Client):** Quan un script PHP vol crear o modificar una *cookie*, utilitza la funció **`setcookie()`**. Aquesta funció no escriu immediatament la *cookie* al navegador, sinó que afegeix una capçalera HTTP anomenada `Set-Cookie` a la resposta del servidor.
    
    
    - **Restricció Crítica:** La capçalera `Set-Cookie` (i per tant la funció `setcookie()`) **ha de ser enviada abans que qualsevol sortida (output) de l'script** (HTML, espais en blanc, etc.). Si PHP ja ha començat a enviar el cos de la pàgina, no pot enviar capçaleres addicionals, i la funció fallarà, provocant un error de tipus "*Headers already sent*".
2. **Emmagatzematge (Client):** El navegador web de l'usuari rep la capçalera `Set-Cookie` i desa el parell clau-valor de manera local.
3. **Transmissió (Client a Servidor):** En cada petició posterior que l'usuari faci al domini corresponent, el navegador inclou automàticament la *cookie* en la capçalera HTTP de la petició, anomenada simplement `Cookie`.
4. **Lectura (Servidor amb PHP):** PHP llegeix la capçalera `Cookie` rebuda i omple automàticament la variable superglobal **`$_COOKIE`**. El script pot accedir a les dades de la *cookie* com si fos un *array* associatiu (`$_COOKIE['nom_cookie']`).

  
</div>## Exemple d'Ús amb PHP

Per manipular les *cookies* utilitzem principalment dues eines en PHP: la funció **`setcookie()`** per crear-les i la variable **`$_COOKIE`** per llegir-les.

### - Establir una Cookie

La sintaxi bàsica de `setcookie()` és:

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-" inline-copy-host=""></div><div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-67 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_249160461730f41f","c_0edf87fd63eef1cb",null,"rc_d5263345a24674f4",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3831953655-67 ng-star-inserted"><span class="ng-tns-c3831953655-67">PHP</span><div _ngcontent-ng-c3831953655="" class="buttons ng-tns-c3831953655-67 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3831953655-67 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-67"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-67">  
</div></div></div>```php
// Ha d'estar abans de <html> o echo!

// Cookie de sessió (expira al tancar el navegador)
setcookie("usuari", "JordiCatalà"); 

// Cookie persistent (expira en 30 dies)
$expiracio = time() + (86400 * 30); // 86400 segons = 1 dia
setcookie("preferencia_idioma", "ca", $expiracio, "/"); 
// Els paràmetres addicionals (path, secure, httponly) són opcionals i clau per la seguretat.
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-67 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_249160461730f41f","c_0edf87fd63eef1cb",null,"rc_d5263345a24674f4",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-67"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-67"></div></div></div><div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--2" inline-copy-host=""></div>### - Llegir i Eliminar una Cookie

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--3" inline-copy-host=""></div><div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-68 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_249160461730f41f","c_0edf87fd63eef1cb",null,"rc_d5263345a24674f4",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3831953655-68 ng-star-inserted"><span class="ng-tns-c3831953655-68">PHP</span><div _ngcontent-ng-c3831953655="" class="buttons ng-tns-c3831953655-68 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3831953655-68 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-68"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-68">  
</div></div></div>```php
<?php
// Llegir una cookie
if (isset($_COOKIE['preferencia_idioma'])) {
    $idioma_seleccionat = $_COOKIE['preferencia_idioma'];
    echo "L'usuari prefereix l'idioma: " . $idioma_seleccionat;
} else {
    echo "No s'ha trobat cap preferència d'idioma.";
}

// Eliminar una cookie
// Per eliminar-la, es crida setcookie() amb una data d'expiració en el passat.
setcookie("usuari", "", time() - 3600); // El valor i la data d'expiració es mouen cap enrere
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-68 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_249160461730f41f","c_0edf87fd63eef1cb",null,"rc_d5263345a24674f4",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-68"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-68"></div></div></div>## Avantatges de les Cookies

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-avantatge-descripci%C3%B3" inline-copy-host=""><table style="width: 100%; height: 199.375px;"><thead><tr style="height: 29.7969px;"><td style="width: 19.3032%; height: 29.7969px;">Avantatge</td><td style="width: 80.6968%; height: 29.7969px;">Descripció Detallada</td></tr></thead><tbody><tr style="height: 46.5938px;"><td style="width: 19.3032%; height: 46.5938px;">**Persistència d'Estat**</td><td style="width: 80.6968%; height: 46.5938px;">Permeten mantenir la informació d'una petició a l'altra, simulant una "memòria" en HTTP.</td></tr><tr style="height: 46.5938px;"><td style="width: 19.3032%; height: 46.5938px;">**Empremta Lleugera**</td><td style="width: 80.6968%; height: 46.5938px;">Són petits fitxers de text que no requereixen recursos del servidor per emmagatzemar la dada.</td></tr><tr style="height: 46.5938px;"><td style="width: 19.3032%; height: 46.5938px;">**Identificació d'Usuari**</td><td style="width: 80.6968%; height: 46.5938px;">Són essencials per a funcions de "Recorda'm" (*autologin*) i per a la implementació de sessions (la *cookie* de sessió només conté l'identificador de la sessió).</td></tr><tr style="height: 29.7969px;"><td style="width: 19.3032%; height: 29.7969px;">**Personalització**</td><td style="width: 80.6968%; height: 29.7969px;">Permeten desar preferències d'usuari (idioma, tema, tipus de lletra) sense haver de passar per una base de dades.</td></tr></tbody></table>

</div>## Inconvenients de les Cookies

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-inconvenient-descrip" inline-copy-host=""><table style="width: 100%;"><thead><tr><td style="width: 25.4914%;">Inconvenient</td><td style="width: 74.5086%;">Descripció Detallada</td></tr></thead><tbody><tr><td style="width: 25.4914%;">**Límit de Mida**</td><td style="width: 74.5086%;">La majoria de navegadors limiten la mida a **4 KB** per *cookie* i a unes 20-50 *cookies* per domini. No són aptes per emmagatzemar grans quantitats de dades.</td></tr><tr><td style="width: 25.4914%;">**Riscos de Seguretat**</td><td style="width: 74.5086%;">Si s'emmagatzema informació sensible (com una contrasenya) sense xifrar, pot ser compromesa fàcilment, ja que es transmeten en cada petició. Això es mitiga usant els atributs `Secure` i `HttpOnly`.</td></tr><tr><td style="width: 25.4914%;">**Control del Client**</td><td style="width: 74.5086%;">Les *cookies* s'emmagatzemen al costat del client, cosa que significa que l'usuari pot **esborrar-les, modificar-les** o directament **deshabilitar-les** al seu navegador.</td></tr><tr><td style="width: 25.4914%;">**Regulació (GDPR/LSSI)**</td><td style="width: 74.5086%;">A causa de la seva funció de rastreig, les *cookies* (especialment les de tercers) estan subjectes a estrictes normatives de privacitat i requereixen el **consentiment explícit** de l'usuari abans de ser establertes.</td></tr><tr><td style="width: 25.4914%;">**Retard de Latència**</td><td style="width: 74.5086%;">Com que es reenvien amb cada petició HTTP (fins i tot per a imatges o fitxers estàtics), poden afegir un petit *overhead* de latència, especialment si són moltes i grans.</td></tr></tbody></table>

</div>## La funció `setcookie()`

La funció **`setcookie()`** de PHP és l'eina primària per crear i gestionar *cookies*. S'encarrega d'enviar la capçalera HTTP `Set-Cookie` des del servidor al navegador de l'usuari, que és l'encarregat d'emmagatzemar la dada.

<p class="callout info">Per protocol, **`setcookie()` ha de ser cridada abans que qualsevol output (sortida) es generi a l'script** (com ara HTML, `echo`, `print`, o fins i tot espais en blanc abans de l'etiqueta `<?php`).</p>

### - Paràmetres de `setcookie()`

La funció accepta fins a set paràmetres (o vuit a PHP 7.3+ si s'utilitza l'array d'opcions):

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-posici%C3%B3-nom-del-par%C3%A0" inline-copy-host=""><table><thead><tr><td>Posició</td><td>Nom del Paràmetre</td><td>Requerit</td><td>Descripció</td></tr></thead><tbody><tr><td>**1**</td><td>`name`</td><td>Sí</td><td>El **nom** de la *cookie*. Aquest nom s'utilitzarà per accedir a la dada a través de `$_COOKIE['name']`.</td></tr><tr><td>**2**</td><td>`value`</td><td>No</td><td>El **valor** de la *cookie*. La dada que es vol emmagatzemar (ex: un ID d'usuari). Aquest valor es codifica automàticament a URL.</td></tr><tr><td>**3**</td><td>`expire`</td><td>No</td><td>El **temps d'expiració** de la *cookie* com a timestamp UNIX. Si s'estableix a 0 (per defecte), la *cookie* expirarà quan l'usuari tanqui el navegador (és a dir, serà una *cookie* de sessió).</td></tr><tr><td>**4**</td><td>`path`</td><td>No</td><td>El **camí del servidor** on la *cookie* estarà disponible. Utilitzar `"/"` la fa accessible a tot el domini. El valor per defecte és el directori actual on es crida `setcookie()`.</td></tr><tr><td>**5**</td><td>`domain`</td><td>No</td><td>El **domini** pel qual la *cookie* està disponible (ex: `"exemple.cat"`). Per fer-la accessible també als subdominis (ex: `blog.exemple.cat`), s'ha d'anteposar un punt (ex: `".exemple.cat"`).</td></tr><tr><td>**6**</td><td>`secure`</td><td>No</td><td>Booleà. Si es posa a **`true`**, la *cookie* només s'enviarà a través de connexions **HTTPS** segures. És una bona pràctica de seguretat.</td></tr><tr><td>**7**</td><td>`httponly`</td><td>No</td><td>Booleà. Si es posa a **`true`**, la *cookie* serà inaccessible per llenguatges de *scripting* del costat del client (com JavaScript). Ajuda a mitigar atacs de Cross-Site Scripting (XSS).</td></tr></tbody></table>

</div>#### Exemple 1: Cookie de Sessió Bàsica

Aquesta *cookie* només existirà mentre el navegador estigui obert.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--5" inline-copy-host=""></div><div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-84 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_0f4610ce4abf5d5b","c_0edf87fd63eef1cb",null,"rc_077b4100613072dd",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3831953655-84 ng-star-inserted"><span class="ng-tns-c3831953655-84">PHP</span><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3831953655-84 mat-unthemed ng-star-inserted"></button></div><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-84"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-84">  
</div></div></div>```php
<?php
// Usuari ha iniciat sessió. 
// La cookie expira quan es tanca el navegador (expire = 0 per defecte).
setcookie("session_id", "abc12345def67890", 0, "/");

echo "Cookie de sessió establerta.";
// L'usuari veurà la cookie la propera vegada que carregui una pàgina.
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-84 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--6" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_0f4610ce4abf5d5b","c_0edf87fd63eef1cb",null,"rc_077b4100613072dd",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-84"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-84"></div></div></div><div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--7" inline-copy-host=""></div>#### Exemple 2: Cookie Persistent amb Configuració de Seguretat

Aquesta *cookie* s'utilitza per una preferència d'usuari i dura **7 dies**, només s'envia per HTTPS i no és accessible per JavaScript.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--8" inline-copy-host=""></div><div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-85 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-3" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_0f4610ce4abf5d5b","c_0edf87fd63eef1cb",null,"rc_077b4100613072dd",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3831953655-85 ng-star-inserted"><span class="ng-tns-c3831953655-85">PHP</span><div _ngcontent-ng-c3831953655="" class="buttons ng-tns-c3831953655-85 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3831953655-85 mat-unthemed ng-star-inserted"></button></div></div></div>```php
<?php
// Temps d'expiració: ara + (segons en un dia * 7 dies)
$expiracio_7_dies = time() + (86400 * 7); 
$path_total = "/"; 
$domini = "exemple.cat"; // La cookie és vàlida per a exemple.cat

setcookie(
    "tema_preferit", // name
    "foscur",        // value
    $expiracio_7_dies, // expire
    $path_total,     // path
    $domini,         // domain
    true,            // secure (Només HTTPS)
    true             // httponly (No accessible per JS)
);

echo "Cookie persistent establerta per 7 dies.";
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-85 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--9" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_0f4610ce4abf5d5b","c_0edf87fd63eef1cb",null,"rc_077b4100613072dd",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-85"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-85"></div></div></div><div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--10" inline-copy-host=""></div>#### Exemple 3: Eliminar una Cookie

Per eliminar una *cookie*, s'ha de cridar `setcookie()` amb el mateix nom, el mateix *path* i el mateix *domain*, i establir el temps d'expiració a una data passada.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--11" inline-copy-host=""></div><div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-86 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_0f4610ce4abf5d5b","c_0edf87fd63eef1cb",null,"rc_077b4100613072dd",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3831953655-86 ng-star-inserted"><span class="ng-tns-c3831953655-86">PHP</span><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3831953655-86 mat-unthemed ng-star-inserted"></button></div><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-86"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-86">  
</div></div></div>```php
<?php
// Només cal establir l'expiració en el passat i igualar el path i el domini si es van utilitzar
setcookie("tema_preferit", "", time() - 3600, "/", "exemple.cat");

echo "Cookie 'tema_preferit' eliminada.";

// La cookie desapareixerà del navegador de l'usuari després d'aquesta petició.
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-86 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--12" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_0f4610ce4abf5d5b","c_0edf87fd63eef1cb",null,"rc_077b4100613072dd",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-86"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-86"></div></div></div>### - Ús de l'Array d'Opcions (PHP 7.3+)

A partir de PHP 7.3, es pot utilitzar una sintaxi més llegible passant un *array* d'opcions com a tercer paràmetre, en lloc de passar tots els valors individuals. Això permet incloure opcions avançades com l'atribut **`SameSite`** (crític per la seguretat web moderna).

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-clau-de-l%27array-equi" inline-copy-host=""><table><thead><tr><td>Clau de l'Array</td><td>Equival a Paràmetre</td></tr></thead><tbody><tr><td>`'expires'`</td><td>`expire` (timestamp)</td></tr><tr><td>`'path'`</td><td>`path`</td></tr><tr><td>`'domain'`</td><td>`domain`</td></tr><tr><td>`'secure'`</td><td>`secure` (booleà)</td></tr><tr><td>`'httponly'`</td><td>`httponly` (booleà)</td></tr><tr><td>**`'samesite'`**</td><td>Nou. Pot ser `'Strict'`, `'Lax'` o `'None'`.</td></tr></tbody></table>

</div>#### Exemple 4: Cookie amb SameSite

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--13" inline-copy-host=""></div><div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-87 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-5" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_0f4610ce4abf5d5b","c_0edf87fd63eef1cb",null,"rc_077b4100613072dd",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3831953655-87 ng-star-inserted"><span class="ng-tns-c3831953655-87">PHP</span><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3831953655-87 mat-unthemed ng-star-inserted"></button></div><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-87"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-87">  
</div></div></div>```php
<?php
$opcions = [
    'expires'  => time() + 3600, // Expira en 1 hora
    'path'     => '/',
    'domain'   => '.aplicacio.com',
    'secure'   => true, 
    'httponly' => true,
    'samesite' => 'Lax' // Millora la seguretat contra CSRF
];

// setcookie(name, value, array $options)
setcookie('token_remember', 'abcdef123456', $opcions);

echo "Cookie amb opcions de seguretat modernes establerta.";
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-87 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--14" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_0f4610ce4abf5d5b","c_0edf87fd63eef1cb",null,"rc_077b4100613072dd",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-87"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-87"></div></div></div>### - El paràmetre `samesite` (PHP 7.3+)

El paràmetre **`SameSite`** és un atribut de seguretat fonamental per a les *cookies* que va ser introduït per mitigar un tipus de vulnerabilitat web molt comú: els atacs de **Falsificació de Peticions en Llocs Creuats (Cross-Site Request Forgery o CSRF)**.

Aquest paràmetre controla si una *cookie* ha de ser enviada automàticament pel navegador quan la petició s'origina des d'un **lloc web diferent** al que va establir la *cookie*.

#### Funcionament i Tipus de Valors

L'atribut `SameSite` es configura en la capçalera `Set-Cookie` enviada pel servidor i accepta tres valors principals: `Lax`, `Strict` i `None`.

##### 1. `SameSite=Lax` (Recomanat per Defecte)

Aquest és el mode d'equilibri, i el valor recomanat per la majoria d'aplicacions:

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-com-funciona%3A-la-coo" inline-copy-host="">- **Com funciona:** La *cookie* **NO s'envia** quan la petició es fa des d'un lloc extern (tercer) mitjançant mètodes insegurs com `POST`.
- **Excepció:** La *cookie* **SÍ s'envia** si la navegació des del lloc extern es fa a través d'un mètode segur (`GET`), com en el cas d'un clic en un enllaç o la càrrega d'una imatge.
- **Ús:** És ideal per a *cookies* que mantenen la sessió (com les de PHP, si no s'utilitza `Strict`), ja que permet que els usuaris puguin arribar al vostre lloc a través d'enllaços externs sense perdre la sessió immediatament, alhora que ofereix protecció contra CSRF bàsic.

</div>##### 2. `SameSite=Strict` (Màxima Seguretat)

Aquest mode ofereix la màxima protecció contra atacs CSRF.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-com-funciona%3A-la-coo-1" inline-copy-host="">- **Com funciona:** La *cookie* **MAI s'envia** si la petició es fa des d'un context de lloc creuat (*cross-site*), independentment del mètode HTTP utilitzat.
- **Ús:** S'ha d'utilitzar per a *cookies* que gestionen estats d'alta seguretat o accions molt sensibles (per exemple, les *cookies* que s'utilitzen per confirmar una operació financera o canvis de contrasenya).
- **Inconvenient:** Si un usuari inicia sessió i després fa clic en un enllaç al vostre propi lloc web des d'un correu electrònic o una altra aplicació, la *cookie* de sessió no s'enviarà, i l'usuari semblarà que no ha iniciat sessió.

</div>##### 3. `SameSite=None` (Sense Protecció)

Aquest valor inhabilita completament la protecció i permet l'enviament de la *cookie* en totes les peticions de lloc creuat.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-com-funciona%3A-la-coo-2" inline-copy-host="">- **Com funciona:** La *cookie* **S'envia sempre** amb les peticions de lloc creuat.
- **Requeriment:** Quan s'utilitza `SameSite=None`, la *cookie* **HA D'incloure obligatòriament l'atribut `Secure`** (és a dir, només es pot enviar a través de HTTPS).
- **Ús:** Només s'ha d'utilitzar quan la *cookie* és estrictament necessària per a la funcionalitat d'un tercer (per exemple, *widgets* incrustats, píxels de seguiment o serveis publicitaris).

  
</div>#### Exemple d'Implementació amb PHP

A partir de PHP 7.3, l'atribut `SameSite` es configura millor mitjançant l'array d'opcions a la funció `setcookie()`:

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--15" inline-copy-host=""></div><div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-99 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-6" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f8c80e586eb35b2c","c_0edf87fd63eef1cb",null,"rc_f0fd9c2801f0d99d",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3831953655-99 ng-star-inserted"><span class="ng-tns-c3831953655-99">PHP</span><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3831953655-99 mat-unthemed ng-star-inserted"></button></div><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-99"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-99">  
</div></div></div>```php
<?php

// 1. Cookie amb SameSite=Strict (Alta seguretat)
setcookie('sessio_estricta', 'token123', [
    'expires' => time() + 3600,
    'path' => '/',
    'httponly' => true,
    'samesite' => 'Strict' 
]);

// 2. Cookie amb SameSite=Lax (Valor recomanat per defecte)
setcookie('preferencia_usuari', 'mode_clar', [
    'expires' => time() + (86400 * 30),
    'path' => '/',
    'httponly' => true,
    'samesite' => 'Lax' 
]);

// 3. Cookie amb SameSite=None (S'usa per a tercers, requereix 'Secure' = true)
setcookie('widget_tercers', 'data_widget', [
    'expires' => time() + 86400,
    'path' => '/',
    'secure' => true, // OBLIGATORI amb SameSite=None
    'samesite' => 'None' 
]);
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-99 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--16" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f8c80e586eb35b2c","c_0edf87fd63eef1cb",null,"rc_f0fd9c2801f0d99d",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-99"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-99"></div></div></div>## Importància en la Seguretat (CSRF)

Sense l'atribut `SameSite`, un atacant podria fer que un usuari iniciat en una aplicació (per exemple, un banc) fes clic en un enllaç o carregués una imatge en un lloc web maliciós. Aquest lloc web maliciós podria enviar una petició *amagada* al banc (per exemple, de transferència de fons).

Com que el navegador de la víctima automàticament adjuntaria la *cookie* de sessió del banc a aquesta petició (perquè els navegadors antigament feien això per defecte), el banc la processaria com una acció legítima.

L'atribut **`SameSite`** impedeix aquest comportament en la majoria de casos, ja que instruccions com **`Lax`** o **`Strict`** fan que la *cookie* **no s'adjunti** a la petició iniciada des del lloc maliciós, neutralitzant l'atac.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--17" inline-copy-host=""></div><div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--19" inline-copy-host=""></div>