Recientemente un hacker tratado de frenar mi sitio web usando el sueño de la inyección. Aunque estamos utilizando precauciones como mysql_real_escape_string() para cubrir más vulnerables de entradas. Estamos pasando el id del producto a través de la cadena de consulta y que hace que el comando como:

$id = mysql_real_escape_string($_REQUEST['id']);
$qry = "Select * from products where id = ".$id;

pero hacker probado para proporcionar la entrada como

?id=3 and sleep(4)

y consulta se convierte en

Select * from products where id = 3 and sleep(4);

Aunque hay algunas posibles soluciones como

  1. Comprobar si el identificador de producto es numérico o no
  2. Quitar la palabra sueño de entrada utilizando algunos personalizado en función de

¿Hay algún otro método para detener esto? ¿Cuál es el mejor método para prevenir el sueño inyecciones?

Son conscientes de que los mysql_ funciones están en desuso y no se debe utilizar?
Parámetro de enlace impedirá que este
uso mysqli_ lugar mysql_
Aye, mira en declaraciones preparadas no solo para prevenir el » sueño de la inyección (que no he oído), sino todos los tipos de inyección de SQL.
En realidad, el atacante no han querido frenar su sitio web, pero leer todo el contenido de su base de datos utilizando un tiempo ciego de consulta ataque. El truco es que él puede intentar adivinar byte por byte, por el uso de algo como Y <algunos de comparación> == «A» Y el SUEÑO(5) – si la página tarda +5 seg, a continuación, la primera suposición era cierta. Es increíble cómo el conjunto de la base de datos se puede leer como este (aunque lento).

OriginalEl autor dirtyhandsphp | 2013-01-27

4 Comentarios

  1. 20

    No se escape correctamente. mysql_real_escape_string es para escapar de SQL cadena sintaxis correctamente, pero son simplemente incrustar el valor de pelado del valor, no como cadena SQL. Usted necesita:

    $qry = "SELECT * FROM products WHERE id = '$id'";

    Nótese las comillas alrededor de la id en la consulta.

    Si el id numérico aunque, echando a un número sería más sensato:

    $id = (int)$_GET['id'];
    +1 Para señalar el uso adecuado de mysql_real_escape_string.
    Gracias por la respuesta. Yo había aceptado porque es la primera parte significa el uso adecuado de mysql_real_escape_string() es más relativo y más rápida respuesta a mi pregunta.
    Vale la pena agregar que mysql_* funciones están en desuso y no debe ser usado nunca más.
    también es muy importante resaltar, que la consulta requiere comillas simples para que funcione correctamente. en el caso de utilizar comillas dobles dentro de la cadena de consulta para sorround el valor de rendir {mysql_real_escape_string()} inútil!

    OriginalEl autor deceze

  2. 10

    El mejor método para prevenir inyecciones SQL es el uso de la tecnología actual. El MySQL mysql_ familia de funciones es obsoleto y será removido de PHP en una futura revisión.

    Debe utilizar sentencias preparadas con MySQLi o PDO lugar.

    De estas tecnologías, el uso de declaraciones preparadas y consultas parametrizadas. Las sentencias SQL son leídos por el servidor de base de datos por separado de los parámetros. Es imposible que un atacante inyectar SQL malicioso.

    Básicamente tienes dos opciones para lograr esto:

    1. MySQLi:

      $stmt = $dbConnection->prepare('SELECT * FROM table WHERE name = ?');
      $stmt->bind_param('s', $name);
      $stmt->execute();
      $result = $stmt->get_result();
      while ($row = $result->fetch_assoc()) {
          //do something with $row
      }
    2. PDO:

      $stmt = $pdo->prepare('SELECT * FROM table WHERE name = :name');
      $stmt->execute(array(':name' => $name));
      foreach ($stmt as $row) {
          //do something with $row
      }

    Lo que pasa es que la instrucción SQL que se pasa a prepare se analiza y compila el servidor de base de datos. Mediante la especificación de parámetros (ya sea un ? o el nombre de un parámetro como :name) puede decirle al motor de base de datos lo que desea filtrar. Entonces, cuando usted llame execute el comunicado se combina con los valores de los parámetros que especifique.

    La cosa importante aquí es que los valores de los parámetros se combinan con el compilado de la declaración, no una cadena SQL. La inyección de SQL obras de engañar a la secuencia de comandos en incluyendo malicioso cadenas cuando se crea SQL para enviar a la base de datos. Así, mediante el envío de la real de SQL por separado a partir de los parámetros de limitar el riesgo de acabar con algo que no tenía la intención. Cualquier parámetro que se envía cuando se utiliza una instrucción preparada acaba de ser tratados como cadenas (aunque el motor de base de datos puede hacer en la optimización de parámetros pueden terminar como los números también, por supuesto).

    Entiendo el concepto de «declaraciones preparadas», pero puede usted explicar por qué no es válido para filtrar el $_REQUEST['id'] como una primera capa de protección contra los no deseados parámetros que se pasa?
    La verdadera pregunta es, «¿por Qué molestarse?» El filtrado es como lo hicimos en el pasado, pero los tiempos cambian, y nos hemos mudado.
    Para un valor numérico que me dice que todo tiene que caer en la línea de «declaraciones preparadas» & todos debemos confiar sólo en que los modernos métodos de interfaz—que tengan defectos que no son aparentes hasta que reveló—es mejor? ¿Es usted realmente sugieren puro URL params sólo debe ser pasado a lo largo de sin marcar? Que parece un problema esperando a suceder.
    Eso es genial, sobre todo la parte que dice, «…y es mucho más difícil de sacar. AFAIK, casi nunca se ve real de 2º orden de los ataques, como es generalmente más fácil social-ingeniero a su manera.» Y, a continuación, el comentario, «Si TODAS sus consultas parametrizadas, también estás protegido contra de 2º orden de inyección. 1 de la orden de inyección es olvidar que los datos de usuario no es de fiar. 2º orden de inyección es olvidar que la base de datos no es de fiar (porque proviene de que el usuario originalmente).» Que pone una cereza en él, ¿no crees?
    Hey gente, Gordon es absolutamente correcto. Si usted piensa que escapar de datos para SQL es simplemente una medida de seguridad, entonces usted está en para una sorpresa. No escapar de datos para algo, hasta que se utilice en el contexto en el que se debe eludir. De lo contrario, se acaba de hacer un lío de sus datos! También, de segundo orden ataques nunca debe ser posible si usted construir su sistema de derecho y el uso de consultas preparadas. Usted puede pensar que no es un problema… pero lo es. Incluso si usted no lo ve como un problema de seguridad, recuerde que una simple cita marca en un campo de tornillo hasta más tarde. Tal vez no es malicioso, pero roto por lo menos.

    OriginalEl autor Gordon Freeman

  3. 0

    debe convertir las consultas en «declaraciones preparadas» usando PDO o mysqli.

    OriginalEl autor Emery King

Dejar respuesta

Please enter your comment!
Please enter your name here