Como se proteger do SQL Injection

De Wiki Locaweb
Ir para: navegação, pesquisa

SQL Injection

  SQL Injection é um ataque que consiste na inserção (conhecido como injeção) de uma query via aplicação web. A Locaweb 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 htmlspecialchars, addslashes 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 Locaweb 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

Referências por linguagem ou framework

Veja também