# Securització inputs

Sens dubte. Les **Funcions de Filtre de PHP** representen un conjunt d'eines essencial per a qualsevol desenvolupador, ja que són la manera més segura i recomanada de gestionar les dades d'entrada d'usuari i validar variables. El seu objectiu principal és separar les dades brutes de la lògica de l'aplicació, garantint que només es processin dades netes i amb el format esperat.

## Funcions de Filtre (Visió Detallada)

Les funcions es divideixen en dos grups: les que treballen amb variables externes (com `$_GET` o `$_POST`) i les que treballen amb variables locals.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-funci%C3%B3-descripci%C3%B3-de" inline-copy-host=""><table style="width: 100%;"><thead><tr><td style="width: 27.5328%;">Funció</td><td style="width: 40.038%;">Descripció Detallada</td><td style="width: 32.5484%;">Ús Típic</td></tr></thead><tbody><tr><td style="width: 27.5328%;">**`filter_input()`**</td><td style="width: 40.038%;">Obté una variable d'entrada externa específica (de les superglobals `$_GET`, `$_POST`, etc.) i l'aplica un filtre de validació o sanejament en una sola operació.</td><td style="width: 32.5484%;">La forma **més segura** d'obtenir dades de formularis (p. ex., obtenir i validar una adreça de correu electrònic d'un camp `POST`).</td></tr><tr><td style="width: 27.5328%;">**`filter_input_array()`**</td><td style="width: 40.038%;">Obté múltiples variables d'entrada externes i permet aplicar diferents filtres a cadascuna mitjançant un *array* de definició.</td><td style="width: 32.5484%;">Processar la totalitat d'un formulari amb diversos camps i requisits de filtre diferents.</td></tr><tr><td style="width: 27.5328%;">**`filter_var()`**</td><td style="width: 40.038%;">Aplica un filtre de validació o sanejament a qualsevol variable **local** de l'script (no d'entrada externa).</td><td style="width: 32.5484%;">Validar dades obtingudes d'una base de dades, arxiu de configuració, o variables definides dins de la lògica.</td></tr><tr><td style="width: 27.5328%;">**`filter_var_array()`**</td><td style="width: 40.038%;">Filtra múltiples variables locals utilitzant un *array* de definició.</td><td style="width: 32.5484%;">Validar un *array* de dades de configuració abans d'utilitzar-les.</td></tr><tr><td style="width: 27.5328%;">**`filter_has_var()`**</td><td style="width: 40.038%;">Comprova si una variable d'entrada d'un tipus concret existeix (`$_POST['email']`).</td><td style="width: 32.5484%;">Determinar si s'ha enviat un formulari o si un camp concret està present.</td></tr><tr><td style="width: 27.5328%;">**`filter_list()`**</td><td style="width: 40.038%;">Retorna un *array* amb tots els noms de filtre disponibles.</td><td style="width: 32.5484%;">Diagnòstic i depuració (per veure quins filtres suporta la teva instal·lació de PHP).</td></tr><tr><td style="width: 27.5328%;">**`filter_id()`**</td><td style="width: 40.038%;">Retorna l'ID sencer d'un nom de filtre donat.</td><td style="width: 32.5484%;">Ús intern o per generar mapes de filtres.</td></tr></tbody></table>

</div>## Tipus de filtres (Validació vs. Sanejament)

Els filtres es divideixen en dos grans grups, que actuen de manera fonamentalment diferent:

### Filtres de validació (`FILTER_VALIDATE_...`)

Aquests filtres només comproven si la dada compleix un format o regla específica.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-retorn%3A-la-dada-orig" inline-copy-host="">- **Retorn:**
    
    
    - La dada original, si la validació és **exitosa** (`true`).
    - **`false`**, si la dada **no compleix** el format (p. ex., un *string* no és una adreça de correu electrònic vàlida).
- **Objectiu:** Assegurar que la dada és **correcta**.

</div>### Filtres de sanejament (`FILTER_SANITIZE_...`)

Aquests filtres netegen la dada, eliminant caràcters no desitjats o codificant-los per fer-los segurs.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-retorn%3A-la-dada-modi" inline-copy-host="">- **Retorn:**
    
    
    - La dada **modificada** i neta.
- **Objectiu:** Fer que la dada sigui **segura**, especialment abans de mostrar-la a l'usuari (per prevenir atacs XSS) o abans de guardar-la a la base de dades.

</div>## Exemples pràctics (Validació i Sanejament)

### Exemple 1: Obtenir i validar una adreça de mail (POST)

Aquest és l'ús més segur per obtenir dades d'entrada d'un formulari:

<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-195 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f908289a45709eff","c_0edf87fd63eef1cb",null,"rc_060e6e0e53efc340",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-195 ng-star-inserted"><span class="ng-tns-c3831953655-195">PHP</span><div _ngcontent-ng-c3831953655="" class="buttons ng-tns-c3831953655-195 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-195 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-195"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-195">  
</div></div></div>```php
<?php
// Suposem que $_POST['email'] conté l'entrada de l'usuari

// Utilitzem filter_input()
$email_brut = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); 
// Saneja: neteja el string, eliminant caràcters que no hauria de tenir un email.

// Validem el format (és vital fer-ho DESPRÉS del sanejament)
if ($email_brut !== false) {
    $email_validat = filter_var($email_brut, FILTER_VALIDATE_EMAIL); 
    
    if ($email_validat) {
        echo "Adreça de correu electrònic vàlida i segura: " . $email_validat;
    } else {
        echo "Error: El format de l'adreça no és correcte.";
    }
} else {
    echo "Error: El camp de correu electrònic és necessari.";
}
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-195 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f908289a45709eff","c_0edf87fd63eef1cb",null,"rc_060e6e0e53efc340",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-195"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-195"></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>### Exemple 2: Validar un nombre enter amb rang i flags

Validem que una variable local (o d'entrada) sigui un enter i que estigui dins d'un rang concret.

<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-196 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f908289a45709eff","c_0edf87fd63eef1cb",null,"rc_060e6e0e53efc340",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-196 ng-star-inserted"><span class="ng-tns-c3831953655-196">PHP</span><div _ngcontent-ng-c3831953655="" class="buttons ng-tns-c3831953655-196 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-196 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-196"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-196">  
</div></div></div>```php
<?php
$edat_entrada = "35";

$opcions = [
    'options' => [
        'min_range' => 18,
        'max_range' => 99
    ]
];

// Validació de l'enter amb un filtre de rang
$edat_validada = filter_var(
    $edat_entrada, 
    FILTER_VALIDATE_INT, 
    $opcions
);

if ($edat_validada === false) {
    echo "L'edat ha de ser un enter entre 18 i 99.";
} else {
    echo "Edat processada: " . $edat_validada;
}
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-196 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f908289a45709eff","c_0edf87fd63eef1cb",null,"rc_060e6e0e53efc340",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-196"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-196"></div></div></div><div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--5" inline-copy-host=""></div>### Exemple 3: Filtrar múltiples entrades (filter\_input\_array)

Utilització de **`filter_input_array()`** per processar un formulari sencer amb diferents regles.

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--6" inline-copy-host=""></div><div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-197 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f908289a45709eff","c_0edf87fd63eef1cb",null,"rc_060e6e0e53efc340",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-197 ng-star-inserted"><span class="ng-tns-c3831953655-197">PHP</span><div _ngcontent-ng-c3831953655="" class="buttons ng-tns-c3831953655-197 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-197 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-197"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-197">  
</div></div></div>```php
<?php
// Definim les regles de filtratge
$definicions = [
    'nom' => [
        'filter' => FILTER_SANITIZE_STRING, // Neteja la cadena (elimina tags)
        'flags'  => FILTER_FLAG_NO_ENCODE_QUOTES // No codifica cometes
    ],
    'quantitat' => [
        'filter' => FILTER_VALIDATE_FLOAT, // Valida com a número flotant
        'options' => ['default' => 0.0] // Si falla, estableix 0.0
    ],
    'web' => FILTER_VALIDATE_URL // Validació simple d'URL
];

// Suposant que tenim dades a $_POST, les filtrem totes
$resultats_filtrats = filter_input_array(INPUT_POST, $definicions);

if ($resultats_filtrats['web'] === false) {
    echo "La URL no és vàlida.";
} else {
    echo "Nom netejat: " . $resultats_filtrats['nom'];
}
```

<div _ngcontent-ng-c3831953655="" class="code-block ng-tns-c3831953655-197 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--7" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f908289a45709eff","c_0edf87fd63eef1cb",null,"rc_060e6e0e53efc340",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c3831953655="" class="formatted-code-block-internal-container ng-tns-c3831953655-197"><div _ngcontent-ng-c3831953655="" class="animated-opacity ng-tns-c3831953655-197"></div></div></div>## Referències PHP.net

Per a una referència exhaustiva de tots els filtres, opcions i constants, consulta la secció oficial de la documentació:

<div _ngcontent-ng-c2698689856="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-visi%C3%B3-general-de-les" inline-copy-host="">- **Visió General de les Funcions de Filtre:** [https://www.php.net/manual/en/book.filter.php](https://www.php.net/manual/en/book.filter.php)
- **Funció `filter_input()`:** [https://www.php.net/manual/en/function.filter-input.php](https://www.php.net/manual/en/function.filter-input.php)
- **Llista Completa de Constants de Filtre:** [https://www.php.net/manual/en/filter.constants.php](https://www.php.net/manual/en/filter.constants.php)

</div>Utilitzar aquestes funcions és l'estàndard modern en PHP per garantir la seguretat contra vulnerabilitats comunes com **Injecció SQL** (juntament amb *prepared statements*) i **Cross-Site Scripting (XSS)**.

<p class="callout danger">**Mai** s'ha de confiar en les dades d'entrada sense una validació i un sanejament adequats.</p>

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