Estoy aprendiendo acerca de evitar inyecciones SQL y estoy un poco confundida.

Cuando se utiliza bind_param, no entiendo el propósito. En la página del manual, he encontrado este ejemplo:

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

Ahora, suponiendo que esos 4 variables fueron el usuario ingresado, no entiendo cómo esto impide que las inyecciones de SQL. Por mi entendimiento, que todavía puede de entrada lo que quieran allí.

También no puedo encontrar una explicación para la 'sssd' allí. ¿Qué hacer? Es que lo que hace es seguro-er?

Última pregunta: he leído en otra pregunta que mysqli_real_escape_string está en desuso, pero no dice que en el manual. ¿Cómo es obsoleto? No puede escapar caracteres especiales ya que por alguna razón?

Nota: Esta pregunta se explica lo que bind_param, pero todavía no entiendo por qué es más seguro o más protegidos.
Bind_param explicación

sssd se traduce a string, string, string, double. By my understanding, they can still input whatever they want in there. Correcta. Pero no SQL se analiza dentro de estas cuatro variables.
En el enlace que se envía a usted se le olvidó leer php.net/manual/en/mysqli-stmt.bind-param.php que los detalles en types A string that contains one or more characters which specify the types for the corresponding bind variables:
SQL se analiza» lo que significa Que todavía puede insertar SQL, simplemente no los lee como SQL, ¿correcto? Eso significa que si yo no tenía forma de validación, que sólo podía entrar en comandos SQL en mi base de datos en el campo, pero no importa, porque el SQL no analiza?
Que es derecho. Los datos de la lógica y de la consulta de la lógica es distinta.
La diferencia es que select * from users where id=$id está construido con datos externos, pero select * from users where id=? no lo es.

OriginalEl autor EveyPortman | 2013-08-25

2 Comentarios

  1. 15

    Ahora, suponiendo que esos 4 variables fueron el usuario ingresado, no entiendo
    cómo esto impide que las inyecciones de SQL. Por mi entendimiento, que todavía puede
    de entrada lo que quieran allí.

    El principal principio no es mediante declaración preparada que está diseñado para el envío seguro de la consulta a la db del servidor, esto se puede hacer por escapar de la entrada de usuario que no es parte de la consulta real, y también la comprobación de la consulta sin ningún (cláusula where) para comprobar la validez de la consulta antes de utilizar cualquiera de los parámetros.

    A partir de esta pregunta: PDO envía raw consulta a MySQL mientras Mysqli envía consulta preparada, ambos producen el mismo resultado

    $stmt = $mysqli->prepare("SELECT * FROM users WHERE username =?")) {
    $stmt->bind_param("i", $user);
    $user = "''1''";

    registros del servidor:

      130802 23:39:39   175 Connect   ****@localhost on testdb
        175 Prepare   SELECT * FROM users WHERE username =?
        175 Execute   SELECT * FROM users WHERE username =0
        175 Quit

    Mediante declaración preparada, db servidor comprobará la consulta sin ningún parámetro, en esta etapa, los errores pueden ser detectados antes de unirse a cualquier parámetro, entonces, si la consulta es válida, los parámetros también se puede enviar al servidor para finalizar la consulta.

    De Manual de PHP http://php.net/manual/en/mysqli.quickstart.prepared-statements.php:

    Escape y la inyección de SQL

    Las variables vinculadas ser escapado automáticamente por el servidor. El
    inserta sus valores escapados en los lugares adecuados en el
    declaración de la plantilla antes de la ejecución. Una sugerencia debe ser proporcionada a la
    servidor para el tipo de variable ligada, para crear un adecuado
    de conversión. Ver la función mysqli_stmt_bind_param() para obtener más
    información.

    ..

    También no puedo encontrar una explicación para la ‘sssd’. ¿Qué
    hacer? Es que lo que hace es seguro-er?

    Aquí está la respuesta: http://php.net/manual/en/mysqli-stmt.bind-param.php

    i
    corresponding variable has type integer
    
    d
    corresponding variable has type double
    
    s
    corresponding variable has type string
    
    b
    corresponding variable is a blob and will be sent in packets

    Última pregunta: he leído en otra pregunta que
    mysqli_real_escape_string está en desuso, pero no dice que en
    en el manual. ¿Cómo es obsoleto? No puede escapar caracteres especiales
    ya que por alguna razón?

    Puede dar una referencia? Creo que no entendieron bien con (mysql_real_escape_string())

    Gracias, y sí, debo haber leído mysql como msqli en algún lugar.
    por favor, tenga en cuenta que esta respuesta es errónea.
    publicar respuesta correcta y menciona lo que está mal en mi respuesta también.

    OriginalEl autor

  2. 11

    Mediante el uso de declaraciones preparadas en el que se separan las consultas SQL del usuario de los datos de entrada. En lugar de los datos de entrada, poner marcadores de posición (‘?’ char) en la consulta SQL. Luego de enviar la consulta al servidor DBMS (por ejemplo: MySQL) por medio de la «mysqli::preparar el» método. Por lo que el servidor comprueba que todo está bien y, si es así, espera a que los datos de entrada. Por ahora ya conoce a su consulta. Sólo tiene que esperar para la entrada de datos para enlazar a la consulta.

    En este punto, «bind_param» entra en acción, la unión marcadores de posición para el usuario de los datos de entrada.
    Observe que bind_param sólo se une a los marcadores de posición de datos de dejar sin cambios la consulta.
    Así no hay manera de cambiar la versión original de SQL de la consulta, porque ya ha enviado al servidor mediante el método de preparación y porque está enviando consultas SQL y los datos de entrada por separado, de manera que el usuario de los datos de entrada no puede interferir con las consultas.

    De todos MODOS…

    El propósito real para el uso de un comunicado en SQL es reducir el costo de procesamiento de consultas, de NO separar los datos de la consulta. Eso es lo que se usa ahora, no es lo que fue diseñado para ser utilizado en el primer lugar.

    ‘sssd’ es sinónimo de «cadena», «cadena», «string» y «doble».
    De hecho: $código es una cadena, $idioma es una cadena, $oficial es una cadena y $ % es un tipo double.

    mysqli_real_escape_string no es obsoleto, pero mysql_real_escape_string está en desuso
    (el primero es mysqlI, donde I significa «mejora»).

    OriginalEl autor italian developer

Dejar respuesta

Please enter your comment!
Please enter your name here