Skip to content

Injection… Estou realmente seguro?

Olá,

Bom, neste segundo artigo aqui venho falar um pouco sobre segurança em sistemas PHP.

Creio que muitos acham que este é um assunto batido: Também acho!
Mas, depois de verificar alguns sistemas em PHP começei a perceber alguns “istupros” à segurança na internet…

Injection Básico

Caso você seja um programador experiênte, diriga-se à próxima seção. Ou leia esta apenas por diversão =)

< ? $user = $_POST["usuario"]; $senha = $_POST["senha"]; $sql = "SELECT * FROM users WHERE user='" . $user ."' AND senha='" . $senha . "'"; $result = mysql_query($sql,$cox); ?>

Temos ai em cima um exemplo de um site “exploitável” via SQL Injection.

Como a maioria dos programadores deve saber, qualquer “piá de prédio” que se preze iria colocar, por exemplo no campo usuário o valor 1′ OR 1=’1 ou o clássico admin’#.
Desta forma o SQL ficaria assim:


$sql = "SELECT * FROM users WHERE user='1' OR 1='1' AND senha=''xxxxxxxx";
OU
$sql = "SELECT * FROM users WHERE user='admin'#' AND senha=''xxxxxxxx";

Isso retornaria um usuário qualquer no banco de dados, e o segundo caso, o usuário malicioso (vulgo: piá de prédio) teria acesso ao usuário admin….

Mas como todos sabem, podemos facilmente evitar esses problemas tratando as variáveis com mysql_escape_string(), que substitui caracteres perigosos por \Caracteres, evitando SQL injtections.

Escape String Mania!!!

Depois de certo tempo, vários administradores de sistemas começaram à usar os tais “escapes strings”, addslashes ou soluções semelhantes….

Ai, em tudo quanto é lugar começaram à utilizar os tais escapes strings, onde precisa e as vezes onde não precisava. E se achavam super seguros..

Analizando códigos, começei a notar os seguintes vícios:
“Tudo o que eu recebo e coloco em um SQL eu preciso dar escape. Ai sim estarei seguro!”
Não é bem assim…. Por exemplo no código abaixo:

Quero selecionar todas as entradas da minha agenda de uma determinada classe “”

$class = mysql_escape_string($_GET['class']);
$sql = 'SELECT * FROM agenda WHERE class=' . $class . ' AND user=' . $_SESSION['user'];

Você, leitor deste blog, programador PHP, diria que isto é um SQL “seguro”?
Regra número 2: Nunca confie no que vem do cliente.

Utilizando de um código como este, o usuário poderia simplismente digitar na barra de endereços:
http://www.meusiteinseguro.com.br/pagina.php?class=10%20OR%201
Resultando no seguinte SQL:
SELECT * FROM agenda WHERE class=10 OR 1 AND user=250
O que resultaria numa cáca danada pro sistema, abrindo todos os dados da agenda, de todos os usuários…
Isso falando apenas de SELECTs. O problema seria muito maior se tratando de updates e deletes.

Na verdade esse é apenas um problema de mal uso de escape_string.
Não basta apenas utiliza-las para verificar um possível injection. O problema seria resolvido formatando os dados usanod, por exemplo, a fução intval(): que pega apenas números inteiros de uma string.

Verifique se você não cometeu, ou está cometendo esses erros…

3 Comments

  1. Guilherme Viebig

    Olá, primeiramente é um prazer postar esse comment. Sou programador, e concordo plenamente com você. Acho que sue post ficou ótimo mas poderia ser mais abrangente.

    Validação de dados é muito importante, tanto client-side javascript, e server-side php. Para tornar aplicações seguras todo e quaquer dado deve ser validado antes de fazer parte de uma query.

    Já existem muitos software que automaticamente rodam scripts para testar injections, scriptkidies podem se divertir a bessa… O idela eh ter uma biblioteca de string de SQL injections mais comuns e comparar os dados de entrada com os contidos na

    Posted on 01-Nov-06 at 4:32 pm | Permalink
  2. Guilherme Viebig

    biblioteca. É muito importante usar funçoes como levenshtein, para comparar a distancia entre as strings.. e a qualquer alarme deve banir temporariamente o IP da requisição.

    Outro aspecto importante a discutir eh que hoje em dia é muito facil mandar valores POST modificados.

    Parabéns pelo artigo

    Posted on 01-Nov-06 at 4:35 pm | Permalink
  3. Danilo Cesar

    Mandar POST modificados é extremamente divertido.
    Por sinal, tem um de meus artigos que fala sobre isso.

    Também acho que poderia ser mais abrangente, mas fiquei por ai mesmo.
    Já ouvi falar mas nunca usei estas bibliotecas para testar injections.

    Mas segurança em PHP, estou mais preocupado hoje em segurança com o servidor do que com a aplicação propriamente dita… Mas este é um assunto para um próximo artigo =)

    Obrigado pelo comment,
    []s
    Danilo Cesar

    Posted on 01-Nov-06 at 9:46 pm | Permalink

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*