Ejemplo de inyección SQL en PHP y cómo evitarla

shape
shape
shape
shape
shape
shape
shape
shape

SQL Injection es una técnica para inyectar código SQL malicioso a través de lagunas en la aplicación. Se trata de un grave fallo que pone completamente en peligro la seguridad del sitio.

 

Ejemplo de inyección SQL

 

Supongamos que un hacker accede a una página de cualquier tienda que tenga este fallo de seguridad.

Una encuesta de este tipo daría lugar básicamente a una consulta:

SELECT nome, preco
FROM produtos
WHERE nome = 'XBOX One'

 

Suponiendo que en esta investigación exista un fallo que nos permita inyectar código SQL, el hacker podría entonces simplemente inyectar cualquier código SQL:

Lo que daría lugar a la consulta:

SELECT nome, preco
FROM produtos
WHERE nome = ''; DROP TABLE produtos; --'

En otras palabras, ¡la tabla de productos quedaría destruida!

Para sortear el problema anterior podríamos utilizar expresiones regulares para invalidar los caracteres que pudieran causarnos problemas, pero a continuación te mostraré una sencilla función de PHP que te será muy útil para evitar este tipo de ataques.

 

Cómo evitar la Inyección SQL usando PHP PDO (PHP Data Object)

 

PDO es una interfaz para acceder a bases de datos en PHP.

Vamos a utilizar una función sencilla que nos ayudará a sortear el problema antes mencionado.

<?php

class Database {

    private $host = 'localhost';
    private $db = 'loja';
    private $user = 'root';
    private $pass = '123';
    private $pdo;

    public function __construct() {
        $this->pdo = new PDO("mysql:host=$this->host;dbname=$this->db", $this->user, $this->pass);
        if (!$this->pdo)
            throw new Exception("Erro ao conectar com BD");
    }

    public function buscarProduto($nome) {
        $stmt = $this->pdo->prepare("SELECT nome, preco FROM produtos WHERE nome = ?");
        $stmt->bindParam(1, $nome, PDO::PARAM_STR);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($row)
            return $row;
        else
            throw new Exception("Erro - Arquivo não encontrado", 12);
    }
}

?>

El truco de PDO para evitar la Inyección SQL es la función bindParam(), que «escapa» caracteres que pueden ser ofensivos para su Consulta.

Las utilidades de PDO van más allá de protegernos de SQL Injection, ya que nos ofrece otras funcionalidades como Transacciones y demás. Para más información, visite http://php.net/manual/pt_BR/book.pdo.php.

 

Me gustaría enfatizar que SQL Injection es un tema avanzado, el ejemplo citado en este post es un caso simple de la situación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *