[Resuelto] Duda sobre como resolver Inyección SQL

Iniciado por ShadowA7X, 16 Abril 2017, 18:12 PM

0 Miembros y 1 Visitante están viendo este tema.

ShadowA7X

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 (sql) [Seleccionar]

"SELECT * FROM Alumno WHERE rut = ​:rut​"


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

Código (sql) [Seleccionar]

define("SQLITE_DB_PATH", "navegadorcito.db");

$connection = new SQLite3(SQLITE_DB_PATH) or die("No se pudo Conectar con la base de Datos");

$sqlStr = "SELECT * FROM Alumno WHERE rut = " . $_GET["rut"];
   echo $sqlStr;
   $connection->query($sqlStr);
   $query = $connection->query($sqlStr);
   while($fila = $query->fetchArray()) {
       print_r($fila);
       echo "<br/>";
   }



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 (sql) [Seleccionar]


//Connect this creates a new PDO object
$db = new PDO('sqlite:/path/to/database.sdb');

//Build your sql query with parameters :field
$sql = "SELECT * FROM sometable WHERE someCol=:field";
//Prepare the above query
$statement = $db->prepare($sql);
//Bind the value received from the form or such with the parameter place holder
$statement->bindParam(':field', $_POST['someVal']);
//Execute the prepared query
$statement->execute();
//Fetch the result
$result = $statement->fetchAll(PDO::FETCH_ASSOC);


//Treat the result as a pure array
foreach ($result as $row){
   //do something
}


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.

engel lex

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

$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

$db = NEW PDO('sqlite:tu_base_de_datos.loquesea');
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

Código (php) [Seleccionar]
<?php
define
("SQLITE_DB_PATH""navegadorcito.db");

// Nueva instancia de PDO y manejar errores en modo exception.
$db = new PDO('sqlite:'.SQLITE_DB_PATH);
$db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

try {

    
$sql 'SELECT * FROM Alumno WHERE rut = :rut';
    
$stmt $db->prepare($sql); // se prepara la consulta

    
$stmt->bindParam(':rut'$_GET['rut']); // se define el parametro

    
$stmt->execute();
    
$resultado $db->fetchAll(PDO::FETCH_ASSOC); // se obtienen los resultados
}

catch(
PDOException $err){
    die(
'Error PDO: '$err->getMessage()); // Exit; en caso de error.
}


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

ShadowA7X

#3
Chicos, inmensamente agradecido, gracias a todos sus datos entendí que me hacía falta en mi código y ahora todo funciona. Muchas gracias!!! :)