quarta-feira, 26 de junho de 2013

Como ocorre injeções de sql e como proteger aplicações php desse ataque

O conteúdo aqui postado é somente informativo para que programadores não fique vulneráveis á ataque, por isso não postamos o código para ataque somente informamos os cuidados que o programador deve tomar.
Segue abaixo um exemplo de código vulnerável:

<?php

$id = $_GET['id'];

$sql = "Select * from tbnoticia where id =".$id;



$num_linhas = mysql_num_rows(
$sql
);



?>


considerando que o endeço da página que passa o id seja : 


www.testes.com.br?id=5

então o sql ficaria:

"Select * from tbnoticia where id =5";


se no sql não tiver nada que garanta a integridade do valor do id, o usuário poderá fazer o seguinte ataque e obter o nome de todas as tabelas do banco de dados, não só isso ele poderá passar comando sql que mostrem dados de outros usuários, permissões, entre outras informações que não deveriam ser mostradas:


select * from tbnoticias where id = 0 union select group_ .........

 Para proteger o código é simples, verificando se o id é inteiro você impedirá que o usuário, passe parâmetro via url.


Código seguro - Casting



<?php
$id = (int) $_GET['id'];
$sql = "Select * from tbnoticia where id =".$id;

$num_linhas = mysql_num_rows( $sql );

?>
ou


<?php
$id = (int) $_GET['id'];

if(is_int($id)){

$sql = "Select * from tbnoticia where id =".$id;

$num_linhas = mysql_num_rows( $sql );

}else{

echo "Erro !!";

}
?>

3 comentários:

  1. Muito obrigado, sou um programador novo e me interesso muito pela segurança do sistema, andei testando alguns scripts antigos e é incrível como ninguém pensava em SQLI em seus sistemas

    ResponderExcluir
    Respostas
    1. Sim verdade, dá pra achar bastante sistemas com falhas de segurança, mas ainda há bastante conteúdo sobre esse assunto , logo postarei mais, espero ter ajudado.

      Excluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir