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.
- Tags:
- pdo
- PHP
- sql injection