2011-01-20 14 views
6

Dado el siguiente fragmento de código, ¿Necesito escapar e higienizar $city?¿Debo desinfectar la entrada si uso consultas preparadas de PHP/MySQL?

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$city = "Amersfoort"; 

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $city); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($district); 

    /* fetch value */ 
    $stmt->fetch(); 

    printf("%s is in district %s\n", $city, $district); 

    /* close statement */ 
    $stmt->close(); 
} 

/* close connection */ 
$mysqli->close(); 
?> 

¿Necesita desinfectar cualquier entrada cuando utiliza consultas preparadas?

Respuesta

9

No, no tiene que escaparse ni desinfectar para la protección de inyección. Para otras cosas específicas de la aplicación, puedes desinfectarlo.

que tenía una pregunta similar hace un tiempo:

mysqli_stmt_bind_param SQL Injection

8

@Gary: copió ese fragmento de código directamente desde el manual en php.net sobre mysqli :: prepare. En esa misma página se encuentra el siguiente texto:

"El propósito de las declaraciones preparadas es no incluir datos en sus sentencias SQL. Incluirlas en sus declaraciones SQL NO es seguro. Siempre use declaraciones preparadas. Son más limpias de usar (código más fácil de leer) y no propenso a las inyecciones de SQL ".

Cuál es la respuesta a su pregunta;)

+4

Los árboles se interpusieron en el camino de la madera. ;) –

+0

Sí, pero las declaraciones preparadas a menudo requieren más recursos tanto en la capa de aplicación como en la capa de datos: tenga cuidado cuando vea a alguien decir "siempre use declaraciones preparadas". – Jmoney38

+0

@ Jmoney38 De acuerdo, creo que cada solución debe pensarse detenidamente en lugar de simplemente elegirla porque parece ser una práctica común. – Sander

1

Además. En adición.

Los statemens preparados, si se utilizan correctamente, mitigan casi por completo los problemas de inyección de SQL. Sin embargo, debería formatear/desinfectar los datos de entrada cuando corresponda. La entrada de limpieza no es una característica de seguridad, pero es recomendable para ser robusto y fácil de usar. En caso de que su ciudad $, es posible que desee que se deben eliminar todos los caracteres no-palabra:

$city = trim(preg_replace("/[^\w-]+/", " ", $city)); 

que de nuevo: no sustituye la base de datos de escapar o declaraciones preparadas, pero asegura que los datos coherentes para trabajar.

+0

Pero eso no desinfecta (elimina cualquier carácter ilegal de los datos), sino la validación. Son 2 cosas diferentes. Siempre debe validar sus datos incluso con declaraciones preparadas. – viery365

0

Me doy cuenta de que esta pregunta es muy antigua. Me encontré con eso mientras buscaba la misma información. Me gustaría comentar la respuesta de Sander, pero aún no tengo suficiente reputación para comentar.

Sander dice que no necesita desinfectar, pero al http://www.w3schools.com/php/php_mysql_prepared_statements.asp (y me doy cuenta de que w3schools no siempre es una fuente de información completamente actualizada y precisa, pero me parece que explica las cosas de una manera sensata, fácil de entender la forma), dicen "Nota: si queremos insertar cualquier dato de fuentes externas (como la entrada del usuario), es muy importante que los datos sean desinfectados y validados".

Parece que al usar formularios y aceptar la entrada del usuario, debe desinfectar.

Cuestiones relacionadas