Prevención de inyecciones de SQL

2

Por lo tanto, soy bastante nuevo en SQL, por lo que no estoy muy familiarizado con la forma de evitar las inyecciones de SQL.

Tengo 1 formulario principal que se está utilizando como encuesta y actualmente solo tiene 1 campo de texto. En este momento creo que estoy a salvo del '); DROP TABLE table; -- exploit pero hay más de las que no estoy muy seguro.

A continuación están mis líneas de inserción y actualización. $want es el campo de texto que mencioné.

INSERT INTO polls (ip, continent, hours, timespent, f_champ, l_champ, o_champ, u_champ, b_champ, w_champ, want, story, happy, 4star, 3star, 2star, 1star) VALUES ($ip, '$continent', $hours, '$timespent', '$f_champ', '$l_champ', '$o_champ', '$u_champ', '$b_champ', '$w_champ', CAP_FIRST('$want'), '$story', '$happy', $_4star, $_3star, $_2star, $_1star)

UPDATE polls SET continent = '$continent', hours = $hours, timespent = '$timespent', f_champ = '$f_champ', l_champ = '$l_champ', o_champ = '$o_champ', u_champ = '$u_champ', b_champ = '$b_champ', w_champ = '$w_champ', want = CAP_FIRST('$want'), story = '$story', happy = '$happy', 4star = $_4star, 3star = $_3star, 2star = $_2star, 1star = $_1star WHERE ip = $ip

Actualmente estoy usando PHP y MySQLi (de procedimiento) insertándome en una base de datos phpMyAdmin.

¿Alguien puede proporcionar algún consejo para detener posibles inyecciones? Gracias.

    
pregunta Spedwards 11.02.2015 - 15:43
fuente

2 respuestas

6

La forma correcta de evitar las inyecciones de SQL es usar Declaraciones preparadas .

Aquí hay un ejemplo abreviado tomado de la documentación de PHP:

$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)");
$stmt->bind_param("i", $id);
$stmt->execute();

En lugar de sustituir literalmente el valor de una variable en su consulta, que siempre será vulnerable a la inyección por parte de un atacante creativo, use un comodín - "?" . La variable debe estar vinculada al comodín.

Obviamente este es un ejemplo mucho más simplificado. Debe realizar el manejo de errores y, a menudo, tendrá más de una variable en su declaración. Todo esto se puede encontrar en la documentación .

El concepto de declaraciones preparadas no es exclusivo de PHP. Lo encontrará en prácticamente todos los lenguajes de programación, aunque la implementación puede diferir. Familiarícese con el concepto, porque lo encontrará y lo necesitará con frecuencia.

    
respondido por el S.L. Barth 11.02.2015 - 15:45
fuente
1
  

En este momento creo que estoy a salvo de la explotación genérica '); DROP TABLE table; -- , pero hay más de las que no estoy muy seguro.

Se guardará de esto la mayor parte del tiempo, ya que tiene que usar explícitamente multi_query en PHP + MySQL para permitir consultas apiladas (varias consultas separadas por un punto y coma)

De lo que no se guarda son las inyecciones de SQL que no utilizan consultas apiladas. Esos son por ejemplo:

  • en las declaraciones select : usando union para combinar la declaración select legítima con una segunda instrucción select inyectada, recuperando así datos que no deberían haberse recuperado (y posiblemente archivos de escritura / lectura).
  • en update / delete / insert : inyección basada en error usando XPATH a través de updatexml o extractdata . Básicamente, genera un mensaje de error que contiene los datos que desea extraer de la base de datos.

Las inyecciones también son posibles en las cláusulas de orden y límite.

Como @ S.L. Barth dijo que la forma correcta de evitar la inyección de SQL es usar siempre declaraciones preparadas para todos los datos variables.

    
respondido por el tim 11.02.2015 - 16:10
fuente

Lea otras preguntas en las etiquetas