Gilberto 🦁 PRO
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales
Cualquier aplicación que interactúe con una base de datos está sujeta a varios riesgos y vulnerabilidades de seguridad
El mayor riesgo, en el caso de las bases de datos SQL, es el de la inyección de código
La inyección de código SQL (SQL injection) es una técnica que consiste en modificar las consultas SQL que se ejecutan en el servidor a través de los valores que se ingresan en una interfaz y se envían al manejador de bases de datos
Algunas de las razones por las que podemos tener un riesgo de inyección de código SQL son:
<?php
$usuario=$_POST['usuario'];
$password=$_POST['password'];
$query="SELECT * FROM users WHERE user_name='".$usuario."' AND user_password='".$password"';";
?> <?php
$usuario=$_POST['usuario'];
$password=$_POST['password'];
$query="SELECT * FROM users WHERE user_name='".$usuario."' AND user_password='".$password"';";
?>¿Qué sucede si la variable $_POST['usuario'] tiene el siguiente valor?
<?php
$usuario = 'loquesea'
$password = ‘ or ‘a’=’a’ ‘or’ <?php
$usuario=$_POST['usuario'];
$password=$_POST['password'];
$query="SELECT * FROM users WHERE user_name='".$usuario."' AND user_password='".$password"';";
?>¿Qué sucede si la variable $_POST['usuario'] tiene el siguiente valor?
<?php
$usuario = 'loquesea'
$password = ‘ or ‘a’=’a’La consulta se convierte en:
<?php
$sqlQuery="SELECT * FROM users WHERE user_name='loquesea' AND user_password='' OR 'a'='a';";
?> <?php
$id = 1;
$query = "SELECT * FROM users where id=$expected_data";
?> <?php
$id = 1;
$query = "SELECT * FROM users where id=$expected_data";
?>¿Qué sucede si la variable $id tiene el siguiente valor?
<?php
$id = "1; DROP TABLE users;"; <?php
$id = 1;
$query = "SELECT * FROM users where id=$expected_data";
?>¿Qué sucede si la variable $id tiene el siguiente valor?
<?php
$id = "1; DROP TABLE users;";La consulta se convierte en:
<?php
$sqlQuery="SELECT * FROM users where id=1; DROP TABLE users;";
?>Una sentencia preparada (prepared statement) es una consulta SQL precompilada por el servidor SQL
La consulta debe estar en un formato parametrizado, de modo que la consulta y los datos se manejen por separado para que el servidor los opere en su propia capa
<?php
$usuario=$_POST['usuario'];
$password=$_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE user_name = :username AND user_password = :password");
$stmt->bindParam(':username', $usuario);
$stmt->bindParam(':password', $password);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
?> <?php
$usuario=$_POST['usuario'];
$password=$_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE user_name = :username AND user_password = :password");
$stmt->bindParam(':username', $usuario);
$stmt->bindParam(':password', $password);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
?><?php
$usuario = ‘ or ‘a’=’a’ ‘or’
?>¿Qué sucede si la variable $_POST['usuario'] tiene el siguiente valor?
<?php
$usuario=$_POST['usuario'];
$password=$_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE user_name = :username AND user_password = :password");
$stmt->bindParam(':username', $usuario);
$stmt->bindParam(':password', $password);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
?><?php
$usuario = ‘ or ‘a’=’a’ ‘or’
?> <?php
"SELECT * FROM users WHERE user_name = '‘ or ‘a’=’a’ ‘or’' AND user_password = "
?>¿Qué sucede si la variable $_POST['usuario'] tiene el siguiente valor?
La consulta se convierte en:
En términos concretos la forma para evitar ataques de inyección de código es:
By Gilberto 🦁
Sentencias preparadas
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales