A Injeção de SQL, mais conhecida através do termo americano SQL Injection, é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com bases de dados via SQL. Deste modo a chamada injeção de SQL ocorre quando o atacante consegue inserir uma série de instruções SQL dentro de uma consulta (query) através da manipulação das entrada de dados de uma aplicação.
Para exemplificar o funcionamento da injeção de SQL, consideremos uma instrução SQL comum:
Essa instrução, que representa uma consulta na base de dados, retorna todas os registros das colunas "id", "nome" e "sobrenome" da tabela "autores". A partir desta mesma instrução, os registros a serem retornados podem ser restritos através da inclusão da cláusula WHERE, como é visto abaixo:
Com base nesta instrução, é fácil supor que "josé" e "silva" são strings, cujo conteúdo será preenchido pela entrada feita por algum usuário que estiver fazendo uso da aplicação.
Portanto, supondo que a aplicação não faça o tratamento apropriado do conteúdo inserido pelo usuário, o mesmo pode fazer o uso acidental do caractere de aspas simples. Gerando a entrada:
nome = jo'sé
sobrenome = silva
E fazendo com que a aplicação gere o código:
SELECT id, nome, sobrenome FROM autores WHERE nome = 'jo'sé' AND sobrenome = 'silva';
De acordo com a especificação da linguagem SQL, existe um erro de sintaxe nessa instrução, uma vez que a string passada para o campo nome é a apenas palavra "jo", pois a adição das aspas simples quebraram a delimitação das aspas simples originais da consulta. O interpretador do SQL espera que o restante da instrução seja outros comandos SQL válidos que complementem a instrução principal. No entanto, como "sé" não é um identificador válido, essa instrução não será executada e retornará um erro.
Com base neste problema, um possível atacante pode manipular os dados de entrada a fim de gerar um comportamento não esperado na base de dados.
Para exemplificar este conceito, consideremos na mesma consulta apresentada, a entrada dos seguintes dados pela aplicação:
nome = jo'; DROP TABLE autores ; --
sobrenome = silva
Fazendo com que a aplicação gere o código:
Fonte:Wikipedia
-----------------------------------
Depois do termo técnico retirado da wiki, vamos ver como nos prevenir deste tipo de ataque.
PRIMEIRO PASSO.
Crie um arquivo PHP chamado anti_injection.php e vamos programar nele:
SEGUNDO PASSO.
Feito isso, nossa função que nos previne desses ataques esta criada. Passamos agora para como usaremos isto, crie outro arquivo complementar em PHP chamado form.php:
TERCEIRO PASSO.
Criamos um formulário simples onde o usuário digita apenas seu nome, e ao enviar o form busca um arquivo chamado recebe.php vamos cria-lo e aplicar nossa função de anti_injection:
Simples e fácil, sua aplicação esta mais segura agora, se você sempre usar esta função de segurança ao receber as variáveis de algum formulário. Espero que gostem, e que seja útil para todos vocês! Abraço galera!
Tutorial por: alexgiroto
Para exemplificar o funcionamento da injeção de SQL, consideremos uma instrução SQL comum:
- Código:
SELECT id, nome, sobrenome FROM autores;
Essa instrução, que representa uma consulta na base de dados, retorna todas os registros das colunas "id", "nome" e "sobrenome" da tabela "autores". A partir desta mesma instrução, os registros a serem retornados podem ser restritos através da inclusão da cláusula WHERE, como é visto abaixo:
- Código:
SELECT id, nome, sobrenome FROM autores WHERE nome = 'josé' AND sobrenome = 'silva';
Com base nesta instrução, é fácil supor que "josé" e "silva" são strings, cujo conteúdo será preenchido pela entrada feita por algum usuário que estiver fazendo uso da aplicação.
Portanto, supondo que a aplicação não faça o tratamento apropriado do conteúdo inserido pelo usuário, o mesmo pode fazer o uso acidental do caractere de aspas simples. Gerando a entrada:
nome = jo'sé
sobrenome = silva
E fazendo com que a aplicação gere o código:
SELECT id, nome, sobrenome FROM autores WHERE nome = 'jo'sé' AND sobrenome = 'silva';
De acordo com a especificação da linguagem SQL, existe um erro de sintaxe nessa instrução, uma vez que a string passada para o campo nome é a apenas palavra "jo", pois a adição das aspas simples quebraram a delimitação das aspas simples originais da consulta. O interpretador do SQL espera que o restante da instrução seja outros comandos SQL válidos que complementem a instrução principal. No entanto, como "sé" não é um identificador válido, essa instrução não será executada e retornará um erro.
Com base neste problema, um possível atacante pode manipular os dados de entrada a fim de gerar um comportamento não esperado na base de dados.
Para exemplificar este conceito, consideremos na mesma consulta apresentada, a entrada dos seguintes dados pela aplicação:
nome = jo'; DROP TABLE autores ; --
sobrenome = silva
Fazendo com que a aplicação gere o código:
- Código:
SELECT id, nome, sobrenome FROM autores WHERE nome = 'jo'; DROP TABLE autores ; --' AND sobrenome = 'silva';
Fonte:Wikipedia
-----------------------------------
Depois do termo técnico retirado da wiki, vamos ver como nos prevenir deste tipo de ataque.
PRIMEIRO PASSO.
Crie um arquivo PHP chamado anti_injection.php e vamos programar nele:
- Código:
<?php
//****************************************************
// @Arquivo: anti_injection.php
// @Data de criação: 15/04/2010
// @Autor: Alex Giroto
// @Email: girottoalex@gmail.com
// @Website: www.oxygenweb.com.br
//****************************************************
funtion anti_injection($sql){
//Primeiro precisamos remover as palavras que contenhão sintaxe SQL
$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);
//Depois limpamos os espaços vazios
$sql = trim($sql);
//Removemos as tags HTML
$sql = strip_tags($sql);
//E adicionamos uma barra invertida a uma string
$sql = addslashes($sql);
}//fim do function
?>
SEGUNDO PASSO.
Feito isso, nossa função que nos previne desses ataques esta criada. Passamos agora para como usaremos isto, crie outro arquivo complementar em PHP chamado form.php:
- Código:
<?php
//****************************************************
// @Arquivo: form.php
// @Data de criação: 15/04/2010
// @Autor: Alex Giroto
// @Email: girottoalex@gmail.com
// @Website: www.oxygenweb.com.br
//****************************************************
?>
<html>
<head>
<title>Teste de anti_injection</title>
</head>
<body>
<form action="recebe.php" method="POST">
Digite seu nome:<br>
<input type="text" name="nome" id="nome"><br>
<input name="envia" id="envia" type="submit" value="salvar">
</form>
</body>
</html>
TERCEIRO PASSO.
Criamos um formulário simples onde o usuário digita apenas seu nome, e ao enviar o form busca um arquivo chamado recebe.php vamos cria-lo e aplicar nossa função de anti_injection:
- Código:
<?php
// @Arquivo: recebe.php
// @Data de criação: 15/04/2010
// @Autor: Alex Giroto
// @Email: girottoalex@gmail.com
// @Website: www.oxygenweb.com.br
//****************************************************
//Primeiro importamos o arquivo protegera nossa aplicação do mysql_injection
require_once("anti_injection.php");
//Agora recebemos o dado nome enviado pelo form, e aplicamos a função de segurança nele
$meuNome = anti_injection($_POST['nome']);
// Continue seu código...
?>
Simples e fácil, sua aplicação esta mais segura agora, se você sempre usar esta função de segurança ao receber as variáveis de algum formulário. Espero que gostem, e que seja útil para todos vocês! Abraço galera!
Tutorial por: alexgiroto