Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: ShadowA7X en 16 Abril 2017, 18:12 pm



Título: [Resuelto] Duda sobre como resolver Inyección SQL
Publicado por: ShadowA7X en 16 Abril 2017, 18:12 pm
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.


Título: Re: Duda sobre como resolver Inyección SQL
Publicado por: engel lex en 16 Abril 2017, 18:20 pm
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 (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');


Título: Re: Duda sobre como resolver Inyección SQL
Publicado por: #!drvy en 16 Abril 2017, 18:48 pm
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


Título: Re: Duda sobre como resolver Inyección SQL
Publicado por: ShadowA7X en 16 Abril 2017, 19:34 pm
Chicos, inmensamente agradecido, gracias a todos sus datos entendí que me hacía falta en mi código y ahora todo funciona. Muchas gracias!!! :)