Es nesesario utilizar la función mysql_real_escape_string en todas las entradas de los formularios?

publicado por: Anonymous

he investigando pero encontré que la función mysql_real_escape_string lo utilizan para el login, en username y password, pero no se si necesario utilizar mysqli_real_escape_string en todas la entradas de los formularios que tengo como administrador.

solución

La aplicación del mysql_real_escape_string se resuelve a entender el funcionamiento de los datos con mysql y con la inyección de sql en los queries.

Cuando fabricas una sentencia SQL, pones las cadenas de caracteres entre comillas dobles: "frase"

En caso de que fabricas dinamicamente una sentencia con variables, estas pueden contener comillas dobles a su vez.

Ejemplo:

$usuario = 'nombre';
$pass = '123"fd';
$sql = 'select * from usuario where nombre = "$nombre" and pass = "$pass"';

Se ve bonito, pero que pasa cuando ves la frase tal cual ?

select * from usuario where nombre = "nombre" and pass = "123"fd";

Notarás que el pass tiene de entrada un error de sintaxis.

Con el mysql_real_escape_string te proteges de esto:

$sql = 'select * from usuario where nombre = "'.mysql_real_escape_string($nombre).'" and pass = "'.mysql_real_escape_string($pass).'"';

Resultado:

select * from usuario where nombre = "nombre" and pass = "123"fd";

Ahora, tienes que conocer la estructura de tus datos y el origen de estos datos para saber si aplicas o no la función.

En general:

  • Si el origen de los datos no lo controlas (es decir, viene del cliente, del exterior, de un campo, de un servicio etc), usa sistematicamente la función para protegerte de una inyección SQL.

  • Si el origen de los datos es controlado pero puede tener ” adentro, (por ejemplo un texto de un artículo etc), usa también la función para protegerte de errores de sintaxis de SQL.

  • Si sabes perfectamente que contienen los queries porque tu los contruyes, y no contienen carácteres que pueden infrigir las reglas de contrucción de SQL, no la necesitas.

Ahora, si usas mysql con variables de queries y no con un query de string, no necesitas escapar las variables

Este es el método más recomendado para usar MySQL

ejemplo: (del manual de PHP)

$city = 'una"ciudad';
sql = /* crear una sentencia preparada */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
    /* ligar parámetros para marcadores */
    $stmt->bind_param("s", $city);
    /* ejecutar la consulta */
    $stmt->execute();
    /* ligar variables de resultado */
    $stmt->bind_result($district);
    /* obtener valor */
    $stmt->fetch();
    printf("%s is in district %sn", $city, $district);
    /* cerrar sentencia */
    $stmt->close();
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *