Limpiar variables POST y GET automáticamente para evitar SQL Injection + PHP

closeHola! hace 4 years 11 months 1 day que escribí esta entrada, puede que esta información ya no sea valida en la actualidad, por favor se comprensivo conmigo cuando comentes 🙂

Comparto con ustedes un metodo que yo uso en mis desarrollos para evitar SQL Injection en nuestras aplicaciones web con PHP, el metodo es muy sencillo solo se debe agregar al inicio de nuestros archivos .php que se van a invocar y lo que hace es recorrer todos los valores recibidos por GET y POST y limpiarlos de cadenas peligrosas.

Opción 1:

$input_arr = array(); 
foreach ($_POST as $key => $input_arr) 
{ 
	$_POST[$key] = addslashes(limpiarCadena($input_arr)); 
}
 
$input_arr = array(); 
foreach ($_GET as $key => $input_arr) 
{ 
	$_GET[$key] = addslashes(limpiarCadena($input_arr)); 
}

Opcion 2 (Gracias al comentario de Jorge Arzuaga)

array_walk($_POST, 'limpiarCadena');
array_walk($_GET, 'limpiarCadena');
function limpiarCadena($valor)
{
	$valor = str_ireplace("SELECT","",$valor);
	$valor = str_ireplace("COPY","",$valor);
	$valor = str_ireplace("DELETE","",$valor);
	$valor = str_ireplace("DROP","",$valor);
	$valor = str_ireplace("DUMP","",$valor);
	$valor = str_ireplace(" OR ","",$valor);
	$valor = str_ireplace("%","",$valor);
	$valor = str_ireplace("LIKE","",$valor);
	$valor = str_ireplace("--","",$valor);
	$valor = str_ireplace("^","",$valor);
	$valor = str_ireplace("[","",$valor);
	$valor = str_ireplace("]","",$valor);
	$valor = str_ireplace("\","",$valor);
	$valor = str_ireplace("!","",$valor);
	$valor = str_ireplace("¡","",$valor);
	$valor = str_ireplace("?","",$valor);
	$valor = str_ireplace("=","",$valor);
	$valor = str_ireplace("&","",$valor);
	return $valor;
}

La función limpiarCadena puedes agregar o quitar cadenas según sea su necesidad.

Espero que les sea de mucha utilidad.

You may also like...

18 Responses

  1. Jorge Arzuaga dice:

    Jose te queda más elegante así y haces lo mismo://array_walk — Aplicar una función de usuario a cada miembro de un arrayarray_walk($_POST, ‘limpiarCadena’);array_walk($_GET, ‘limpiarCadena’);

     
    function limpiarCadena($valor)
    {   $valor = str_ireplace(“SELECT”,””,$valor);
    $valor = str_ireplace(“COPY”,””,$valor);
    $valor = str_ireplace(“DELETE”,””,$valor);
    $valor = str_ireplace(“DROP”,””,$valor);
    $valor = str_ireplace(“DUMP”,””,$valor);
    $valor = str_ireplace(” OR “,””,$valor);
    $valor = str_ireplace(“%”,””,$valor);
    $valor = str_ireplace(“LIKE”,””,$valor);
    $valor = str_ireplace(“–“,””,$valor);
    $valor = str_ireplace(“^”,””,$valor);
    $valor = str_ireplace(“[“,””,$valor);
    $valor = str_ireplace(“]”,””,$valor);
    $valor = str_ireplace(“”,””,$valor);
    $valor = str_ireplace(“!”,””,$valor);
    $valor = str_ireplace(“¡”,””,$valor);
    $valor = str_ireplace(“?”,””,$valor);
    $valor = str_ireplace(“=”,””,$valor);
    $valor = str_ireplace(“&”,””,$valor);  $valor = addslashes($valor);
    return $valor;
    }

  2. tkngrafik dice:

    Yo uso este método no se si es seguro:
    htmlspecialchars ($_POST[‘nombre’])

    • jodacame dice:

      Si es una buena opcion, pero lo que se busca con el metodo que yo escribir es tener un control total de las palabras y caracteres que quieres limpiar y controlar en tu aplicacion. Saludos!

  3. Canaimito dice:

    Gracias de antemano amigos y si necesito la palabra selectivo, me reemplaza select y deja solo ivo, saludos. Espero ayuda con esto.

  4. Claus dice:

    Yo uso algo similar para arreglar algunos scripts que había creado cuando era más novato en donde en un principio, de forma bastante inocente, dejaba esta tarea de escape a magic_quotes. Como escapar cada variable individualmente era mucho trabajo incluí algo bastante similar a esto (Ahora uso PDO). Claro que en vez de addslashes uso las sentencias de escape para el motor. Me parece que deberían usar array_walk_recursive o llamar a una función recursiva mientras sea array para que funcione con elementos que PHP toma como arreglos. Clásico cuando tienes una app en donde se pueden crear objetos en forma dinámica.

    <input name="campo[]" id="campo_1"….
    <input name="campo[]" id="campo_2"….

    <input name="campo[]" id="campo_n"….

  5. mezcalito dice:

    interesante amigo comienzo en esto me podrias decir como implementarlo?

    • jodacame dice:

      Una opcion es crear un archivo php ej: seguridad.php en este archivo agregas la funcion limpiarCadena que esta en este articulo y tambien el siguiente codigo:

      $input_arr = array();
      foreach ($_POST as $key => $input_arr)
      {
      $_POST[$key] = addslashes(limpiarCadena($input_arr));
      }

      $input_arr = array();
      foreach ($_GET as $key => $input_arr)
      {
      $_GET[$key] = addslashes(limpiarCadena($input_arr));
      }

      luego incluyes el archivo que creastes en en encabezado de tus programas:

      ejemplo:

      include(‘seguridad.php’);

      y listo ya estas filtrando todas las variables que lleguen por GET y POST en tus programas, recuerda q este es un ejemplo básico puedes agregar o quitar validaciones de la funcion limpiarCadena.

      Saludos y gracias por visitar mi blog!

  6. jorgito dice:

    recuerda que sql tambien admite minúsculas en las querys
    podrías pasar toda la entrada a minúsculas o al revés
    o mejor aún, usar solo sentencias preparadas, procedimientos almacenados, funciones
    básicamente deberías evitar instrucciones con nombres dinámicos de columna. Sí, ya se. De esta forma puede parecer tedioso o poco dinamico, pero si el proyecto crece, notarse que así es mas fácil y seguro
    saludos

    • jodacame dice:

      La función de php str_ireplace es case sensitive entonces por la parte de mayúsculas y minúsculas no hay problema, lo que dices es muy cierto en usar procedimientos y sentencias preparadas hacen la aplicación mas segura (incluso me atrevería a decir que mas rápida), pero en aplicaciones comerciales y escalables no es muy util debido a que es mucho mas complicado hacer una aplicación que soporte varios motores de bases de datos ya que cada cliente puede usar diferentes motores (Mysql, PosgreSQL, Oracle, MsSQL, etc..) y hacer un procedimiento para cada motor es algo complejo y tomaría mas tiempo… y lo de las sentencias preparadas puede solucionarse usando una abstracción de la capa de datos haciendo un desarrollo MVC y usando una librería como adodb (o la del gusto del desarrollador) desde el cual podamos tener mas control sobre las acciones de los datos. Esta solución que se plantea en esta entrada es una solución rápida y automática para aquellas personas que ya tienen una aplicación hecha y no tienen tiempo de hacer un rediseño de su lógica entonces pueden optar por un mecanismos similar al planteado en este articulo.

      Saludos! y gracias por visitar mi blog.

  7. Max Henrry dice:

    Disculpa . que pasa cuando yo prefiero usar domas $_REQUEST en vez de post y get. tambien habria una función para el request?

  8. Dadier dice:

    Muy buen artículo. Me ha sido de gran utilidad.

  9. Rafael Serrano dice:

    Estoy realizando una aplicacion que tiene 6 paginas cada pagina tiene su post que lo almaceno en variables de seccion , las variables de session las destruyo con session_destroy(); pero tambien quiero limpiar los post de todas las hojas despues que se envia la consulta, como podria utilizar el codigo de ustedes, muchas gracias de antemano.

  10. En
    $valor = str_ireplace(“\”,””,$valor);
    debe ser
    $valor = str_ireplace(“\\”,””,$valor);
    si es que hay problemas con el slah

  11. Andres Quintero dice:

    Buenas tardes amigo .
    Gracias por tu aporte , todavía sigue funcionando la opción 1 sin ningún inconveniente (y).

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *