Ves al contingut principal

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.

Funció Descripció Detallada Ús Típic
filter_input() 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ó. 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).
filter_input_array() Obté múltiples variables d'entrada externes i permet aplicar diferents filtres a cadascuna mitjançant un array de definició. Processar la totalitat d'un formulari amb diversos camps i requisits de filtre diferents.
filter_var() Aplica un filtre de validació o sanejament a qualsevol variable local de l'script (no d'entrada externa). Validar dades obtingudes d'una base de dades, arxiu de configuració, o variables definides dins de la lògica.
filter_var_array() Filtra múltiples variables locals utilitzant un array de definició. Validar un array de dades de configuració abans d'utilitzar-les.
filter_has_var() Comprova si una variable d'entrada d'un tipus concret existeix ($_POST['email']). Determinar si s'ha enviat un formulari o si un camp concret està present.
filter_list() Retorna un array amb tots els noms de filtre disponibles. Diagnòstic i depuració (per veure quins filtres suporta la teva instal·lació de PHP).
filter_id() Retorna l'ID sencer d'un nom de filtre donat. Ús intern o per generar mapes de filtres.

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.

  • 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.

Filtres de sanejament (FILTER_SANITIZE_...)

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

  • 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.

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:

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.";
}

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.

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;
}

Exemple 3: Filtrar múltiples entrades (filter_input_array)

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

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'];
}

Referències PHP.net

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

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).

Mai s'ha de confiar en les dades d'entrada sense una validació i un sanejament adequats.