Segurança

SQL Injection, “injeção de sql”, o que é e como se proteger?

SQL Injection “injeção de sql”, o que é e como se proteger?

Injeção de SQL é uma forma de ataque a um site, que tem como objetivo explorar uma grave falha de segurança nas consultas realizadas no banco de dados.

Normalmente os sites, como lojas virtuais, blogs, sistemas web, utilizam banco de dados para salvar informações dinâmicas e depois exibi-las como conteúdo.

Outras dados que são salvos no banco são os usuários administrativo do site, que tem acesso a painéis para gerenciar o conteúdo, toda essa informação fica salva e protegida por senha, dentro do banco de dados.

Como o ataque funciona

Irei utilizar como exemplo, um sistema web e sua tela de autenticação, composta por Email e Senha, por exemplo.

Ao enviar o usuário e senha, clicando no botão “Entrar”, é realiza uma consulta no banco de dados, para verificar se o usuário existe no banco e a senha digitada está correta.

Exemplo simples da consulta feita no banco de dados:

[code language=”sql”]

SELECT * FROM usuarios WHERE senha = ‘senha’ and usuario = ‘usuario’

[/code]

No exemplo acima, estou procurando o usuário e a senha na tabela “usuarios”, sem realizar nenhuma validação no que está sendo enviado pelo formulário.

Simplesmente pego o conteúdo que foi enviado e concateno na SQL, para realizar a busca.

Como é feita a “injeção”

Deixando os valores sem nenhuma validação é possível que nos campos sejam enviados comandos SQL, para tentar alterar a consulta que está sendo executada e assim, burlar a autenticação no sistema.

Exemplo de valores com SQL injection.

Valor do campo senha enviado no formulário: ‘ or senha != ‘

Valor do campo usuário: ‘ or usuario != ‘

Dessa forma a consulta executada no banco ficará assim:

[code language=”sql”]

SELECT * FROM usuarios WHERE
senha = ” or senha != ” and usuario = ” or usuario != ”

[/code]

Faça você mesmo o teste, criando essa simples estrutura de login, tabelas. Utilizei o banco Mysql no exemplo.

SQL da tabela utilizada

[code language=”sql”]
CREATE TABLE `usuarios` (
`id` int(11) NOT NULL,
`usuario` varchar(50) NOT NULL,
`senha` varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ALTER TABLE `usuarios`
ADD PRIMARY KEY (`id`);
ALTER TABLE `usuarios`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
[/code]

Dados de teste

[code language=”sql”]
INSERT INTO `usuarios` (`id`, `usuario`, `senha`) VALUES (NULL, ‘teste’, ‘123456’);
INSERT INTO `usuarios` (`id`, `usuario`, `senha`) VALUES (NULL, ‘teste2’, ‘123456’);
INSERT INTO `usuarios` (`id`, `usuario`, `senha`) VALUES (NULL, ‘teste3’, ‘123456’);
[/code]

Claro que o exemplo acima é bem simples, porém ainda hoje existem muitos sites e sistemas com essa qualidade de código e a injeção de SQL pode ser feitas em várias situações, não apenas em formulários de logins.

Como me proteger do SQL Injection

Para evitar que isso ocorra, o valor dos campos USUARIO e SENHA, tem que ser validados, antes de colocá-los na consulta.

Cada linguagem de programação, tem uma orientação quanto a isso, você não precisa recriar a roda.

PHP por exemplo, você pode utilizar Statements, segue o link:  http://www.w3schools.com/php/php_mysql_prepared_statements.asp

Só em ultimo caso, faça um filtro você mesmo, uma função que remova caracteres indesejáveis.

Se o campo de usuário for um e-mail, você pode utilizar uma função que valide e-mails reais e submeter o valor do campo a está validação.

Já no campo senha, normalmente, alfa-numéricos, você pode remover todos os caracteres que não correspondem a esse tipo.

SQL Injection é um perigo real, por isso sempre procure profissionais competentes para desenvolver seus sites, sistemas.

Resumo
Nome do Artigo
SQL Injection
Descrição
SQL Injection "Injeção de SQL", aproveita de uma grave falha de segurança nas consultas realizadas no Banco de dados
Autor
Editor
Roger Mauricio Takemiya
Logo do Editor

Post Recentes

Cron do Magento 2 não roda: status missed e pending no cron_schedule

Pedido que não fatura e e-mail que não sai porque todo job fica missed: como ler a cron_schedule, conferir o…

14 horas atrás

Gerar slug de URL em PHP: acento, espaço e símbolo fora do endereço

Uma função curta em PHP 8.3 que transforma Camiseta Preta Tamanho GG em camiseta-preta-tamanho-gg, sem depender do locale do servidor.

1 dia atrás

Log de consentimento LGPD: a tabela MySQL que guarda a prova do aceite

O banner registra o clique só no navegador e some. Veja a tabela MySQL e o endpoint que gravam a…

2 dias atrás

Comando CLI Magento 2: criar a classe e registrar no di.xml

A classe do comando existe e o bin/magento list ignora ela. Falta o registro no di.xml: aqui vai a classe…

3 dias atrás

Traduzir o pt_BR.csv do Magento 2 em lote sem perder a coluna de origem

Como traduzir duas mil linhas do pt_BR.csv do Magento 2 lendo com fgetcsv e regravando com fputcsv, sem encostar na…

3 dias atrás

Variação não está disponível no WooCommerce: limpar transients e lookup

Produto variável respondendo "Desculpe, este produto não está disponível" mesmo com a variação ativa: limpe os transients do WooCommerce e…

4 dias atrás