Uma das maiores classes de vulnerabilidades da web é conhecida como “SQL Injection” ou SQLi. A Structured Query Language, também conhecida como SQL, é a linguagem usada para interagir com a maioria dos bancos de dados, embora várias variantes da linguagem sejam usadas dependendo da plataforma do banco de dados. Qualquer site que armazene dados do usuário, como informações de conta, ou forneça a funcionalidade de upload do usuário, como um site de hospedagem de imagens, usará um banco de dados para armazenar esses dados.
Dica: SQL geralmente é pronunciado como “ess cue ell” ou “sequel”, com a primeira opção sendo mais comum no inglês britânico e a segunda mais prevalente no inglês americano. Ambas as pronúncias são geralmente entendidas no contexto de falar sobre bancos de dados.
O que é SQLi?
SQLi é uma vulnerabilidade em que os desenvolvedores da web que projetam o código que se comunica entre o servidor da web e o banco de dados não implementam proteções contra comandos SQL enviados por um usuário. O problema é que é possível escapar das instruções do banco de dados e adicionar novos argumentos ou uma instrução inteiramente nova. A instrução do banco de dados alterada ou secundária pode executar uma série de ações, incluindo exclusões em grande escala ou vazamentos de dados.
As explorações geralmente giram em torno de fazer com que as declarações existentes sejam verdadeiras em todas as circunstâncias ou fornecer um segundo comando em lote que execute uma ação específica, como excluir ou exibir todos os dados. Por exemplo, uma instrução SQL para fazer login em um site pode verificar se o nome de usuário e a senha enviados correspondem a uma entrada no banco de dados. Para tentar obter acesso, um exploit de injeção SQL pode tentar adicionar uma cláusula “ou true”, como “ou 1 = 1”. Isso tornaria o comando nas linhas de “login com [este] nome de usuário, se a senha for [este] ou esta declaração for verdadeira”.
Como prevenir SQLi
SQLi costumava ser uma forma muito comum de sites terem seu banco de dados violado e, em seguida, vazado online. Devido a um esforço concentrado para garantir que a conscientização sobre a segurança faça parte do treinamento do desenvolvedor, essa classe de vulnerabilidade foi amplamente resolvida e raramente é vista mais.
O método correto para evitar o SQLi é usar instruções preparadas, também conhecidas como consultas parametrizadas. Tradicionalmente, as instruções SQL são declaradas e têm a entrada do usuário concatenada nelas durante essa declaração. Com as instruções preparadas, o comando do banco de dados é escrito e, em seguida, uma função separada executa o comando e insere os dados do usuário. Embora possa parecer uma pequena diferença, ele muda completamente a forma como o comando é tratado. A diferença impede que qualquer comando SQL significativo seja executado e trata todas as entradas do usuário como uma string, evitando que a injeção de SQL aconteça.