PHP SQL Injection Exemplo e Como Evitar

shape
shape
shape
shape
shape
shape
shape
shape

SQL Injection é uma técnica de injetar código SQL malicioso através de brechas que a aplicação pode oferecer. É uma falha grave que compromete completamente a segurança do site.

 

Exemplo de SQL Injection

 

Suponhamos que um hacker acessa uma página de uma loja qualquer que possua essa brecha de segurança.

Uma pesquisa desse tipo basicamente resultaria na consulta:

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

 

Considerando que nesta pesquisa exista a falha que nos permita injetar código SQL, o hacker então poderia simplesmente injetar qualquer código SQL:

Que resultaria na consulta:

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

ou seja, tabela de produtos seria destruída!

Para contornar o problema acima poderíamos utilizar expressões regulares para invalidar caracteres que podem nos causar problemas, porém abaixo estarei mostrando um recurso simples do PHP que será bastante útil para evitarmos esse tipo de ataque.

 

Como evitar SQL Injection usando PHP PDO (PHP Data Object)

 

PDO é uma interface para acessar bancos de dados no PHP.

Utilizaremos um recurso simples que nos ajudará a contornar o problema citado acima.

<?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);
    }
}

?>

O truque do PDO para evitar SQL Injection é a função bindParam(), que realiza o “escape” de caracteres que podem ser ofensivos a sua Query.

As utilidades do PDO vão além de nos proteger de SQL Injection, pois ele nos oferece outros recursos como Transactions e etc. Para mais informações acesse o manual http://php.net/manual/pt_BR/book.pdo.php.

 

Gostaria de reforçar que SQL Injection é um assunto avançado, o exemplo citado neste post é um caso simples da situação.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *