Tutorial: Modo correcto de evitar inyección SQL en consultas

  • Autor Autor Usuario eliminado 44716
  • Fecha de inicio Fecha de inicio
U

Usuario eliminado 44716

Hola a todos, como últimamente he visto que esto lo preguntan mucho y no he visto una respuesta del todo acertada por el foro he decidido colocar este post para que vean cual es la forma mejor de hacer esto para evitar inyecciones SQL a nuestra base de datos.

Con las inyecciones de SQL pueden modificar una consulta a nuestra base de datos introduciendo, una serie de comillas, puntos y coma y demás según nuestro código y la configuración de nuestro php.ini

Muchos creen que con agregar la función mysqli_real_scape_string() ya está todo hecho, pero hay algunos casos en los que no. También he visto gente que agrega addlashes() sin saber bien lo que hace, ni tampoco conociendo que hay casos en las que no se debe usar esta función.

Debemos saber que addlashes escapa un string con barras invertidas y que si en nuestro servidor están activadas las magic_quotes se escapará dos veces la cadena, por lo cual antes de usar esta función debemos comprobar cual es el estado de este parámetro en nuestro servidor, para eso PHP tiene su propia función.

Aquí pongo el código explicado por pasos:

PHP:
<?php

//Si las magic_quotes están desactivadas procedemos nosotros mismos a escapar la cadena, pero si ya están activadas, no tendremos que hacerlo

if (!get_magic_quotes_gpc()) {
    $consulta = addslashes($_POST['consulta']);
}
else {
    $consulta = $_POST['consulta'];
}

//Una vez hemos hecho esto si estamos usando SQL nos valemos de la función mysqli_real_escape_string que también se encarga de convertir la cadena en legal para SQL

    $consulta = mysqli_real_escape_string($login,$consulta);

?>

Espero que les sirva y saludos :encouragement:
 
Última edición por un moderador:
Gracias por el aporte amigo. :encouragement:
 
Unas observaciones que hice :ghost:
Con mysqli_real_escape_string ya basta, no hace falta el addslashes ya que mysqli_real_escape_string se encargará de escapar los ', ", etc.

Otra cosa, el estilo por procedimientos de mysqli_real_escape_string no es el mismo que se utiliza en mysql_real_escape_string. El modo correcto de utilizar aquella función es añadir el link identificador de la conexión a MySQLi, quedando, por ejemplo, si el link es $db:
PHP:
$consulta = mysqli_real_escape_string($db, $consulta);

No es exactamente igual el estilo de MySQLi al de MySQL.

Saludos.
 
Unas observaciones que hice :ghost:
Con mysqli_real_escape_string ya basta, no hace falta el addslashes ya que mysqli_real_escape_string se encargará de escapar los ', ", etc.

Otra cosa, el estilo por procedimientos de mysqli_real_escape_string no es el mismo que se utiliza en mysql_real_escape_string. El modo correcto de utilizar aquella función es añadir el link identificador de la conexión a MySQLi, quedando, por ejemplo, si el link es $db:
PHP:
$consulta = mysqli_real_escape_string($db, $consulta);

No es exactamente igual el estilo de MySQLi al de MySQL.

Saludos.

Según leí en sitios hay algunas cosas que se necesitan escapar con la función addlashes porque a veces mysqli_real_escape_string no lo hace. Yo prefiero poner las dos por sí acaso.

En cuanto a la forma que comentas tienes razón la tomé de la página de php y le añadí la i pero se me olvidó ver los parámetros que se le pasan, ya está corregido.
 
Gracias por el aporte, yo evito las inyecciones con otras funciones :encouragement:
 
Gracias me sera de utilidad.
 

Temas similares

Atrás
Arriba