Filtros (Filter) en PHP

Los filtros de PHP se utilizan para validar y filtrar datos provenientes de fuentes no seguras, como la entrada de usuarios.

¿Qué son los filtros de PHP?

Los filtros de PHP se utilizan para validar y filtrar datos provenientes de fuentes no seguras.

La validación y filtración de la entrada de usuarios o datos personalizados son componentes importantes de cualquier aplicación web.

El objetivo de extender los filtros de PHP es facilitar y acelerar la filtración de datos.

¿Por qué usar filtros?

Casi todos los aplicaciones web dependen de la entrada externa. Estos datos suelen proceder de los usuarios u otras aplicaciones (como servicios web). Al usar filtros, puedes asegurarte de que el programa obtenga el tipo de entrada correcto.

¡Siempre debe filtrar los datos externos!

El filtrado de entrada es uno de los temas de seguridad más importantes en aplicaciones.

¿Qué son los datos externos?

  • Datos de entrada provenientes de formularios
  • Cookies
  • Variables del servidor
  • Resultados de la consulta de base de datos

Funciones y Filtros

Para filtrar variables, utilice una de las siguientes funciones de filtro:

  • filter_var() - Filtrar una variable única con un filtro especificado
  • filter_var_array() - Filtrar múltiples variables con el mismo o diferentes filtros
  • filter_input - Obtener una variable de entrada y filtrarla
  • filter_input_array - Obtener múltiples variables de entrada y filtrarlas con el mismo o diferentes filtros

En el siguiente ejemplo, utilizamos la función filter_var() para validar un entero:

<?php
$int = 123;
if(!filter_var($int, FILTER_VALIDATE_INT))
 {
 echo("Entero no es válido");
 }
else
 {
 echo("Entero es válido");
 }
?>

El código anterior utiliza el filtro "FILTER_VALIDATE_INT" para filtrar la variable. Ya que este entero es válido, la salida del código es: "Entero es válido".

Si intentamos usar una variable no entera, la salida es: "Entero no es válido".

Para obtener una lista completa de funciones y filtros, visite nuestra Manual del Filtrador PHP.

Validating y Sanitizing

Hay dos tipos de filtros:

Filtros de Validating:

  • Usado para validar entradas de usuarios
  • Reglas de formato estrictas (por ejemplo, validación de URL o correo electrónico)
  • Devuelve el tipo esperado si tiene éxito, o FALSE si falla

Filtros de Sanitizing:

  • Usado para permitir o prohibir caracteres especificados en una cadena
  • Sin reglas de formato de datos
  • Siempre devuelve una cadena

Opciones y símbolos

Las opciones y símbolos se utilizan para agregar opciones de filtrado adicionales a los filtros especificados.

Los diferentes filtros tienen diferentes opciones y símbolos.

En el siguiente ejemplo, utilizamos filter_var() y las opciones "min_range" y "max_range" para validar un entero:

<?php
$var=300;
$int_options = array(
"options"=>array
 (
 "min_range"=>0,
 "max_range"=>256
 )
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
 {
 echo("Entero no es válido");
 }
else
 {
 echo("Entero es válido");
 }
?>

Al igual que el código anterior, las opciones deben colocarse en un array relacionado llamado "options". Si se utilizan banderas, no es necesario que estén en el array.

Dado que el entero es "300", no está en el rango especificado, la salida del código será "El entero no es válido".

Para obtener una lista completa de funciones y filtros, visite el sitio web CodeW3C.com proporcionado Manual del Filtrador PHPPuede ver todas las opciones y banderas disponibles de cada filtro.

Verificar entrada

Vamos a intentar verificar la entrada proveniente del formulario.

La primera cosa que debemos hacer es confirmar si existen los datos de entrada que estamos buscando.

Luego filtramos los datos de entrada utilizando la función filter_input()

En el siguiente ejemplo, la variable de entrada "email" se transmite a la página PHP:

<?php
if(!filter_has_var(INPUT_GET, "email"))
 {
 echo("El tipo de entrada no existe");
 }
else
 {
 if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
  {
  echo "El correo electrónico no es válido";
  }
 else
  {
  echo "El correo electrónico es válido";
  }
 }
?>

Explicación del ejemplo:

En el siguiente ejemplo, hay una variable de entrada (email) que se transmite mediante el método "GET":

  1. Verifique si existe una variable de entrada de tipo "GET" para "email"
  2. Si existe una variable de entrada, verifique si es una dirección de correo electrónico válida

Limpiar entrada

Vamos a intentar limpiar la URL que se transmite desde el formulario.

Primero, debemos confirmar si existen los datos de entrada que estamos buscando.

Luego, utilizamos la función filter_input() para limpiar los datos de entrada.

En el siguiente ejemplo, la variable de entrada "url" se transmite a la página PHP:

<?php
if(!filter_has_var(INPUT_POST, "url"))
 {
 echo("El tipo de entrada no existe");
 }
else
 {
 $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
 }
?>

Explicación del ejemplo:

En el siguiente ejemplo, hay una variable de entrada (url) que se transmite mediante el método "POST":

  1. Verifique si existe una variable de entrada de tipo "POST" para "url"
  2. Si existe esta variable de entrada, realice su limpieza (elimine caracteres ilegales) y guárdela en la variable $url

Si la variable de entrada es similar a esto: "http://www.W3非o法ol.com.c字符n/", entonces la variable $url depurada debería ser así:

http://www.codew3c.com/

Filtrar múltiples entradas

Los formularios generalmente están compuestos por múltiples campos de entrada. Para evitar llamar repetidamente a filter_var o filter_input, podemos usar filter_var_array o la función filter_input_array.

En este ejemplo, usamos la función filter_input_array() para filtrar tres variables GET. Las variables GET recibidas son un nombre, una edad y una dirección de correo electrónico:

<?php
$filters = array
 (
 "name" => array
  (
  "filter"=>FILTER_SANITIZE_STRING
  ),
 "age" => array
  (
  "filter"=>FILTER_VALIDATE_INT,
  "options"=>array
   (
   "min_range"=>1,
   "max_range"=>120
   )
  ),
 "email"=> FILTER_VALIDATE_EMAIL,
 );
$result = filter_input_array(INPUT_GET, $filters);
if (!$result["age"])
 {
 echo("La edad debe ser un número entre 1 y 120.<br />");
 }
elseif (!$result["email"])
 {
 echo("El correo electrónico no es válido.<br />");
 }
else
 {
 echo("La entrada del usuario es válida");
 }
?>

Explicación del ejemplo:

El ejemplo anterior tiene tres variables de entrada transmitidas por el método "GET" (name, age y email)

  1. Configurar un array que contenga los nombres de las variables de entrada y los filtros para las variables de entrada especificadas
  2. Llamar a la función filter_input_array, los parámetros incluyen las variables de entrada GET y el array configurado recientemente
  3. Detectar si las variables "age" y "email" en la variable $result tienen entradas ilegales. (Si hay entradas ilegales,)

El segundo parámetro de la función filter_input_array() puede ser un array o un ID de filtro único.

Si el parámetro es un ID de filtro único, este filtro especificado filtrará todos los valores del array de entrada.

Si el parámetro es un array, este array debe seguir las siguientes reglas:

  • Debe ser un array asociativo que contenga las variables de entrada como claves del array (por ejemplo, la variable de entrada "age")
  • El valor de este array debe ser el ID del filtro o un array que especifique el filtro, los índices y las opciones

Uso de Filter Callback

Al usar el filtro FILTER_CALLBACK, puede llamar a una función personalizada y usarla como un filtro. De esta manera, tenemos completo control sobre la filtración de datos.

Puede crear sus propias funciones personalizadas o usar funciones PHP existentes.

Establezca el método que desea usar para la función de filtro, de la misma manera que lo hace para las opciones.

En el siguiente ejemplo, utilizamos una función personalizada para convertir todos los "_" en espacios en blanco:

<?php
function convertSpace($string)
{
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>

El resultado del código anterior es el siguiente:

Peter es un gran tipo!

Explicación del ejemplo:

El ejemplo anterior convierte todos los "_" en espacios en blanco:

  1. Cree una función que reemplace "_" por espacio en blanco
  2. Llame a la función filter_var(), cuyo parámetro es el filtro FILTER_CALLBACK y un array que contiene nuestras funciones