6

Sanear entradas de datos en PHP

Sanear las entradas de datos (del inglés, sanitize data inputs) es una práctica que todos los desarrolladores webs deben hacer en sus proyectos, sobre todo cuando manejamos datos de una base de datos. No sanear estas entradas puede significar que nuestra web es vulnerable a ataques de inyección SQL, por ejemplo.

Para evitar esto y hacer nuestra web más segura, yo siempre uso unas funciones en PHP que ví en el blog de Denham Coote.

Primero, limpiamos de las entradas los tags HTML, Javascript, style y comentarios.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function cleanInput($input) {
 
  $search = array(
    '@<script [^>]*?>.*?@si',            // Strip out javascript
    '@< [/!]*?[^<>]*?>@si',            // Strip out HTML tags
    '@<style [^>]*?>.*?</style>@siU',    // Strip style tags properly
    '@< ![sS]*?--[ tnr]*>@'         // Strip multi-line comments
  );
 
    $output = preg_replace($search, '', $input);
    return $output;
}
?>

Luego añadimos un backslash (barra invertida) a las comillas simples, las comillas dobles, los backslash y los caracteres null. Si tu servidor tiene activado magic_quotes en la configuración de PHP, esto se hará automáticamente. Por si acaso, y para hacer nuestro código más compatible con todas las configuraciones, podemos añadir esta función:

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
function sanitize($input) {
    if (is_array($input)) {
        foreach($input as $var=>$val) {
            $output[$var] = sanitize($val);
        }
    }
    else {
        if (get_magic_quotes_gpc()) {
            $input = stripslashes($input);
        }
        $input  = cleanInput($input);
        $output = mysql_real_escape_string($input);
    }
    return $output;
}
?>

Ahora podemos sanear cualquier cadena de texto, e incluso arrays. Para usar estas funciones simplemente hay que llamar a la función sanitize con parámetro la cadena (o array) a sanear y nos devolverá la cadena (o array) saneado. Por ejemplo:

<?php
$_GET = sanitize($_GET);
$_POST = sanitize($_POST);
$cadena_final = sanitize($cadena_original);
?>

Ya tenemos nuestros datos en GET, POST y en la cadena saneados y listos para insertar en nuestra base de datos sin complicaciones.