Lenguajes de Programación

Sanitizar datos en PHP

Crea tu propio código para sanitizar tus datos o haz uso de una libreria lista para ser usada.

Publicado el 18 de Mayo de 2016
Compartir

Muchas veces nos encontramos con cadenas escritas en español que queremos utilizar para como parte de una URL, o para establecer un nombre de archivo. Pero utilizarlas de forma literal puede causar problemas, ya sea porque los caracteres específicos de nuestro idioma sean representados por códigos alternativos menos legibles, o porque el sistema operativo o sistema de archivos de un usuario utilice una codificación en otro idioma que dificulte su uso.

Aunque tenemos a nuestra disposición ciertas funciones de librería como los filtros de saneamiento indicados en el enlace más abajo, vamos crear nuestro propio código para ello.

https://www.php.net/manual/es/filter.filters.sanitize.php

 

La ventaja de crear nuestro propio código de saneamiento , es que podemos ajustarlo según las necesidades que queramos. Eso sí, es importante ser exhaustivos y revisar que no estamos dejando fuera ningún caso que deba ser tratado.

 

Echemos un vistazo al código de ejemplo que hemos preparado:

<?php
echo '<!DOCTYPE html><head><meta charset="UTF-8"></head><body>';
echo '<h1>Ejemplo sanitizar nombre de fichero</h1>';
echo '<form method="post" action="index.php">Introduce el texto que quieres sanitizar: ';
echo '<input type="text" name="mytext"';
if ( isset ( $_POST['mytext'] ) ) echo ' value="'.$_POST['mytext'].'" ';
echo '><input type="submit" value="Enviar"></form><br>';
if ( ! isset ( $_POST['mytext'] ) ) {
  exit;
}

$source = $_POST['mytext'];
$sane = "";
echo "<pre>Texto a sanitizar: ".$source."<br>";

// Caracteres prohibidos porque en algunos sistemas operativos no son admitidos como nombre de fichero
// Obtenida del código fuente de WordPress.org
$forbidden_chars = array(
  "?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&",
  "$", "#", "*", "(", ")" , "|", "~", "`", "!", "{", "}", "%", "+" , chr(0));

// Caracteres que queremos reemplazar por otros que hacen el texto igualmente legible
$replace_chars = array(
  'áéíóúäëïöüàèìòùñ ',
  'aeiouaeiouaeioun_'
);

// Convertimos el texto a analizar a minúsculas
$source = strtolower($source);

//Comprobamos cada carácterIdit1611

for( $i=0 ; $i < strlen($source) ; $i++ ) {
  $sane_char = $source_char = $source[$i];
  if ( in_array( $source_char, $forbidden_chars ) ) {
    $sane_char = "_";
    $sane .= $sane_char;
    continue;
  }
  $pos = strpos( $replace_chars[0], $source_char);
  if ( $pos !== false ) {
    $sane_char = $replace_chars[1][$pos];
    $sane .= $sane_char;
    continue;
  }
  if ( ord($source_char) < 32 || ord($source_char) > 128 ) {
    // Todos los caracteres codificados por debajo de 32 o encima de 128 son especiales
    // Ver http://www.asciitable.com/
    $sane_char = "_";
    $sane .= $sane_char;
    continue;
  }
  // Si ha pasado todos los controles, aceptamos el carácter
  $sane .= $sane_char;
}
echo "Texto sanitizado : ".$sane;

Vamos a revisar cómo funciona este código. En primer lugar, tenemos un formulario que nos permite introducir una cadena para que sea procesada por el proceso de sanitización.

A continuación tenemos un array llamado $forbidden_chars , que contiene una serie de caracteres prohibidos. Cada vez que se encuentre uno de estos caracteres en la cadena, será totalmente eliminado.

A continuación tenemos un array llamado $replace_chars , con una estructura diferente. El primer elemento es un string que contiene una serie de caracteres que, de encontrarse, deben ser sustituidos por uno en la misma posición que el correspondiente del segundo elemento. Nótese que podemos añadir muchos caracteres diferentes en el primer elemento y que sean todos sustituidos por un mismo carácter, como “_”, repitiendo en las posiciones adecuadas del segundo. Con esto nos aseguramos que eñes y letras acentuadas son sustituidas por sus equivalente más cercanos existentes en una codificación no extendida.

Por último, tenemos un bucle que recorre toda la cadena en búsqueda de los caracteres que debe eliminar o sustituir. Cabe destacar que, además, se comprueba finalmente si el carácter tratado se encuentra por debajo del número 32 o encima del 128 en la tabla ASCII, en cuyo caso es sustituido automáticamente por “_”. Esto nos evita tener que definir cualquier carácter especial que deba ser sustituido así. Si quieres consultar la tabla ASCII, puedes hacerlo en el siguiente enlace: http://www.asciitable.com

Y de esta forma hemos obtenido al final la cadena sanitizada. Aunque estemos recorriéndola a mano con un bucle for creado por nosotros, mientras que la lista de caracteres prohibidos o a sustituir no sea muy grande, su funcionamiento será perfectamente eficiente incluso para cadenas grandes. Pero si en algún caso se desea realizar un procesado de datos muy masivos, conviene en su lugar intentar utilizar expresiones regulares para ello.

 


Compartir este post

También te puede interesar...

Tecnología

Los 5 mejores editores PHP

07 Junio 2017 Daniel Ortego Delgado
Artículos
Ver todos