[PHP] Prevenir inyección SQL en sentencias

¿Cómo se previenen?

Utilizando instrucciones preparadas y consultas parametizadas. Estas son sentencias SQL que son enviadas y analizadas por el servidor de la base de datos separadamente de cualquier parámetro. De esta manera es imposible para un atacante inyectar SQL malicioso.

 

¿Cómo se utilizan?

Usando la extensión MySQLi o PDO y ciertos parámetros que utilizaremos a continuación, en este caso (como yo lo utilizo) voy a poner el ejemplo en MySQLi.

Código

Previamente a empezar con las sentencias, necesitamos crear nuestra conexión con la base de datos, en este caso llamado conexion.php

conexion.php

<?php
##########################
$hostname = "servidor";
$username = "usuario db";
$password = "contraseña db";
$database = "base de datos";
##########################

$conexion = new mysqli($hostname, $username, $password, $database);

/* comprobar conexión */
if ($conexion->connect_error) {
    die('Error de Conexión (' . $conexion->connect_errno . ') '
            . $conexion->connect_error);
}

Una vez creada la conexión, podemos prevenir nuestras inyecciones usando sentencias parametizadas como en este ejemplo.

//Incluimos el anterior código php para poder establecer una conexión con la base de datos. Include_once significa que solo se incluya una vez, para que no se vuelva establecer más veces llevando a errores.
include_once('conexion.php');

//En caso que enviemos mediante post un usuario establecemos variable para prepararla después.
$nombre = $_POST;

//Primero creamos la sentencia SQL
$sql = "SELECT * FROM usuarios WHERE nombre = ?";

//Preparamos la sentencia anteriormente establecida
$stmt = $conexión->prepare($sql); //$conexion es una variable previamente creada para conectarnos a nuestra db.

//Enlazamos el parámetro a la sentencia. La "s" significa "string", en caso de tener un número sería "i". Opciones : i = integer, d = double, s = string, b = blob.
$stmt->bind_param('s', $nombre);

//Ejecutamos
$stmt->execute();

//Obtenemos resultado
$resultado = $stmt->get_result();

//Mientras que haya resultado de filas hacer algo con $row.
while ($row = $result->fetch_assoc()) {
    // Hacer algo con $row.
}

//Y para acabar, liberamos memoria resultados en memoria y cerramos la consulta con close.
$stmt->free_result();
$stmt->close();
PandaGG
Lok'tar ogar

Dejar respuesta

Please enter your comment!
Please enter your name here

Sponsor

Últimos

Udforskning af niche bordspil fra hele verden

IntroduktionI en verden, hvor online spil konstant udvikler sig, er niche bordspil blevet en fascinerende kategori, der tiltrækker opmærksomhed fra både spillere og analytikere....

Registrierung bei HellSpin: Ein Leitfaden für Branchenanalysten

EinführungDie Registrierung bei HellSpin ist ein entscheidender Schritt für Nutzer, die Zugang zu einer Vielzahl von Online-Glücksspielangeboten suchen. In der Schweiz, wo die Regulierung...

¿Vale la pena jugar en Stake España? Un vistazo a su licencia de Curaçao

En un mundo donde el entretenimiento digital se ha convertido en una parte esencial de la vida cotidiana, los casinos en línea han ganado...

Verantwoord spelen bij Betrouwbaar Casino Zonder Cruks: alles over licentiecontrole en

De wereld van het online casino is constant in ontwikkeling en Nederlandse spelers zoeken steeds vaker naar betrouwbare, veilige én transparante platforms zonder Cruks-registratie....

AmunBet Nederland: ontdek de voordelen van een 450% bonus en 450 gratis spins

In de wereld van online gokken biedt AmunBet Nederland een unieke ervaring met een indrukwekkend aanbod van casino spellen, live dealers en sports betting...