Blog Reacción Estudio

¡Tu zona de aprendizaje!

Evitar inyección SQL limpiando las variables con PHP

Cuando vamos a insertar datos a nuestra base de datos con PHP, tenemos que tener especial cuidado con las inyecciones SQL y demás intentos de que nos inserten datos maliciosos por parte de algún usuario. La siguiente función es probablemente la manera más completa y eficiente de limpiar una cadena de texto antes de insertarla en nuestra base de datos.

function cleanInput($input) {

  $search = array(
    '@<script[^>]*?>.*?</script>@si',   // Elimina javascript
    '@<[\/\!]*?[^<>]*?>@si',            // Elimina las etiquetas HTML
    '@<style[^>]*?>.*?</style>@siU',    // Elimina las etiquetas de estilo
    '@<![\s\S]*?--[ \t\n\r]*>@'         // Elimina los comentarios multi-línea
  );

    $output = preg_replace($search, '', $input);
    return $output;
  }

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

Un ejemplo de cómo usar esta función:

$cadena_maliciosa = "Hola <script src='http://www.evilsite.com/bad_script.js'></script> Es un buen día!";
$cadena_limpia = sanitize($cadena_maliciosa);
// $cadena_limpia devuelve "Hola! Es un buen día!"

// También lo puedes usar para las variables POST/GET
$_POST = sanitize($_POST);
$_GET  = sanitize($_GET);