Como se proteger do SQL Injection

SQL Injection

  SQL Injection é um ataque que consiste na inserção (conhecido como injeção) de uma query via aplicação web. A DeServ sempre toma todas as precauções em relação a atualizações para evitar quaisquer brechas de segurança nos sites hospedados.

Entretanto às vezes surgem vulnerabilidades que são exploradas através de programação, de nada adiantando as precauções que tomamos.

Tais vulnerabilidades estão presentes em códigos (ASP, PHP, etc.) colocados pelos próprios clientes. Este é o caso da "SQL Injection", brecha através da qual um invasor pode executar queries ou statements arbitrários numa base relacional via "injeção" de comandos em campos de formulários.

Atualmente existem 5 tipos de SQLi (injeção de sql)

- Poorly Filtered Strings 
- Incorrect type handling 
- Signature Evasion 
- Filter Bypassing 
- Blind SQL Injection: 

Como se proteger?

De acordo com a OWASP as melhores práticas para se previnir de um ataque de SQLi são:

Parametrização das consultas
Usar "stored procedures"
Escapar toda entrada fornecida pelo usuário
Limitar privilégios aos acessos

Usando a função addslashes() tem o mesmo efeito que habilitar magic quotes, porém só aplica onde for conveniente. O que ela faz é colocar um caracter de escapa antes das aspas simples ou dupla, antes da barra invertida e do caracter NULL.

Usar 'prepared statements' ao invés do próprio código SQL atribuíndo todas as outras medidas de prevenção usar esta, nos daria mais performace e segurança, além de ser mais simples de ler e escrever. Porem só pode ser usado em SELECT, INSERT, UPDATE, REPLACE, DELETE e CREATE TABLE.

$login = $_GET['login'] $query = "SELECT * FROM registos WHERE login = '$login'";

Ficaria assim:

$query = "SELECT * FROM registos WHERE login = OR 1";

Recomendamos Limitar Privilégios das contas com acesso ao DB. É importante manter apenas os privilégios e acessos necessários. É comum muitas permissões serem dadas para resolver problemas de funcionalidade, muito parecido ao chmod 777 no linux.

Escapar toda entrada fornecida pelo usuario
Escapar toda entrada fornecida pelo usuário antes de colocá-la em uma consulta.
Todo DMBS (database management system) suporta escapar caracteres.


Para se proteger do SQL Injection verifique se todo parâmetro passado para o site é tratado antes que seja concatenado na query.

Por exemplo, nunca faça simplesmente:

// ASP
consulta = "DELETE FROM tabela WHERE id_tabela = " & Request.Form("id")
 
// PHP
$consulta = "DELETE FROM tabela WHERE id_tabela = " . $_POST[id];


Em vez disso, trate primeiro o Request.Form("id") ou $_POST[id], como neste exemplo:

//ASP
If IsNumeric(Request.Form("id")) Then 
    consulta = "DELETE FROM tabela WHERE id_tabela = " & Request.Form("id") 
Else
    Response.Write "Dados Inválidos"
    Response.End
End If
 
//PHP
if (is_numeric($_POST[id])) {
    $consulta = "DELETE FROM tabela WHERE id_tabela = " . $_POST[id];
} else {
    die("Dados inválidos");
}

No ASP poderíamos ter especificado simplesmente o Request("id"), entretanto este não valida se os dados foram passados pelo método GET (parâmetro especificado na URL) ou POST (dados enviados por formulário que não aparecem na URL), então a pessoa mal-intencionada poderia passar o "id" pela URL. Ao invés disso use:

Request.QueryString("id") -> se o "id" tiver que ser passado via GET
Request.Form("id")        -> se o "id" tiver que ser passado via POST


No PHP faça a mesma coisa, ao invés de simplesmente validar $id, valide:

$_GET[id]  -> se o "id" tiver que ser passado via GET
$_POST[id] -> se o "id" tiver que ser passado via POST


Para campos com strings é aconselhável checar pelos caracteres:

"  (aspas duplas)
'  (aspas simples)
(espaços)
;  (ponto e vírgula)
=  (sinal de igual)
<  (sinal de menor que)
>  (sinal de maior que)
!  (ponto de exclamação)
-- (dois hifens, indica início de comentário em alguns bancos)
#  (sustenido ou jogo-da-velha, indica início de comentário em alguns bancos)
 // (duas barras, indica início de comentário em alguns bancos)

ou pelas palavras reservadas

  - SELECT       - INSERT
  - UPDATE       - DELETE
  - WHERE        - JOIN
  - LEFT         - INNER
  - NOT          - IN
  - LIKE         - TRUNCATE
  - DROP         - CREATE
  - ALTER        - DELIMITER

- No Perl deve-se usar regular expressions de validação e no PHP a função htmlspecialcharsaddslashes e/ou htmlentities.
OBS: O código de programação mencionado acima é uma sugestão, portanto é aconselhável um tratamento mais sofisticado que pode ser encontrado fácilmente pela Internet. Contamos com sua compreensão para o fato de que a DeServ não pode se responsabilizar por apresentar mais detalhes a respeito de sua implementação e utilização. Para mais informações, sugerimos que entre em contato com o seu desenvolvedor, pois tal conhecimento é aberto e de domínio de profissionais técnicos.

 Referências

  • sql injection, proteção sql
  • 0 Usuários acharam útil
Esta resposta lhe foi útil?

Artigos Relacionados

Porque não compartilhamos SSL para websites

Você compartilharia sua escova de dentes? Provavelmente não, pois não se exporia a riscos de...

Ataques DoS (Denial of Service) e DDoS (Distributed DoS)

Introdução Quem acompanha os noticiários de tecnologia e internet certamente já se deparou com...

Proteja seu WordPress de Força Bruta

WordPress é uma plataforma de blogging completa. É feito altamente personalizável e fácil de...

Saiba o que é firewall do servidor

Um firewall é um software aplicativo ou hardware que ajuda a bloquear hackers, vírus e worms que...

Restringindo o acesso de IPs para sua segurança

Você que já possui algum conhecimento sobre o arquivo .htaccess pode passar direto para o passo...