elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: 4n4lDetector v1.3: herramienta de análisis estático de malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  [Resuelto] Duda sobre como resolver Inyección SQL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Resuelto] Duda sobre como resolver Inyección SQL  (Leído 348 veces)
ShadowA7X

Desconectado Desconectado

Mensajes: 19



Ver Perfil
[Resuelto] Duda sobre como resolver Inyección SQL
« en: 16 Abril 2017, 18:12 »

Hola Estimados/as. Junto con saludar me gustaría recurrir a su experiencia en inyección de bases de datos sql. Resulta que tengo que impedir que se pueda realizar una inyección SQL en una base de datos SQLite. Me piden ocupar específicamente el uso de prepared
statements.

Ejemplo:

Código
  1. SELECT * FROM Alumno WHERE rut = ​:rut​"
  2.  

El código que tengo (que funciona por cierto) es:

Código
  1. define("SQLITE_DB_PATH", "navegadorcito.db");
  2.  
  3. $connection = NEW SQLite3(SQLITE_DB_PATH) OR die("No se pudo Conectar con la base de Datos");
  4.  
  5. $sqlStr = "SELECT * FROM Alumno WHERE rut = " . $_GET["rut"];
  6.    echo $sqlStr;
  7.    $connection->query($sqlStr);
  8.    $query = $connection->query($sqlStr);
  9.    while($fila = $query->fetchArray()) {
  10.        print_r($fila);
  11.        echo "<br/>";
  12.    }
  13.  
  14.  

Me imprime por pantalla los datos del rut ingresado por medio del link del navegador. Pero como sabrán los más experimentados, a este código facilmente se le puede poner una inyección sql.

He encontrado código como el siguiente:

Código
  1.  
  2. //CONNECT this creates a NEW PDO object
  3. $db = NEW PDO('sqlite:/path/to/database.sdb');
  4.  
  5. //Build your SQL query WITH parameters :FIELD
  6. $sql = "SELECT * FROM sometable WHERE someCol=:field";
  7. //PREPARE the above query
  8. $statement = $db->prepare($sql);
  9. //Bind the VALUE received FROM the form OR such WITH the parameter place holder
  10. $statement->bindParam(':field', $_POST['someVal']);
  11. //EXECUTE the prepared query
  12. $statement->execute();
  13. //Fetch the RESULT
  14. $result = $statement->fetchAll(PDO::FETCH_ASSOC);
  15.  
  16.  
  17. //Treat the RESULT AS a pure array
  18. foreach ($result AS $row){
  19.    //do something
  20. }

El cual ocupa el método de prepare statements para evitar la injección SQL en una base de datos SQLite, pero no puedo adaptarlo al código que yo tengo. Cada cambio que le hago me lanza un error por pantalla.

Hasta el momento mi principal duda es qué pongo dentro del PDO en ---new PDO('sqlite:/path/to/database.sdb');---

Si bien la base de datos que ocupo se llama navegadorcito.db, cada vez que pongo ese nombre ahí salta un error al cargar el archivo en el navegador.


Ojala me pudieran dar una mano para entender qué pasa.

Agradecido de antemano por leer esto, me despido.


« Última modificación: 16 Abril 2017, 20:50 por #!drvy » En línea

engel lex
CoAdmin
***
Desconectado Desconectado

Mensajes: 11.472



Ver Perfil
Re: Duda sobre como resolver Inyección SQL
« Respuesta #1 en: 16 Abril 2017, 18:20 »

si estás usando y sabes tu manejador SQLite3, no te enredes con otro.... busca como hacer prepared en SQLite3 y listo

http://php.net/manual/es/sqlite3.prepare.php


sobre PDO para resolver tu pregunta

Código:
$db = NEW PDO('sqlite:/path/to/database.sdb');

sqlite: es el manejador, despues de ello, se manejan las rutas estilo unix (no se si es igual en windows), así que "/" será la raliz del sistema, si la db y el php están en la misma carpeta, no necesitas escalar directorios y usas a secas

Código:
$db = NEW PDO('sqlite:tu_base_de_datos.loquesea');


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 4.542



Ver Perfil WWW
Re: Duda sobre como resolver Inyección SQL
« Respuesta #2 en: 16 Abril 2017, 18:48 »

Código
  1. <?php
  2. define("SQLITE_DB_PATH", "navegadorcito.db");
  3.  
  4. // Nueva instancia de PDO y manejar errores en modo exception.
  5. $db = new PDO('sqlite:'.SQLITE_DB_PATH);
  6. $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7.  
  8. try {
  9.  
  10.    $sql = 'SELECT * FROM Alumno WHERE rut = :rut';
  11.    $stmt = $db->prepare($sql); // se prepara la consulta
  12.  
  13.    $stmt->bindParam(':rut', $_GET['rut']); // se define el parametro
  14.  
  15.    $stmt->execute();
  16.    $resultado = $db->fetchAll(PDO::FETCH_ASSOC); // se obtienen los resultados
  17. }
  18.  
  19. catch(PDOException $err){
  20.    die('Error PDO: '. $err->getMessage()); // Exit; en caso de error.
  21. }
  22.  
  23.  
  24. print_r($resultado);


Te recomiendo usar PDO dado que es universal y fácilmente adaptable a otras bases de datos si en un futuro necesitas migrar. De hecho PDO usa el mismo driver que Sqlite3 así que realmente no pierdes nada.

Deberías leer un poco sobre ello antes de hacer copy paste..
http://php.net/manual/es/book.pdo.php
http://www.phptherightway.com/#pdo_extension

Saludos
En línea

ShadowA7X

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: Duda sobre como resolver Inyección SQL
« Respuesta #3 en: 16 Abril 2017, 19:34 »

Chicos, inmensamente agradecido, gracias a todos sus datos entendí que me hacía falta en mi código y ahora todo funciona. Muchas gracias!!! :)
« Última modificación: 16 Abril 2017, 20:49 por #!drvy » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines