Desenvolvimento - PHP

PHP: Anti SQLInjection no Login

Este pequeno artigo, mostra um código em PHP simples informando como escapar do SQL Injection sem funções.

por Josimar Finamore



Olá pessoal...

Hoje nós vamos tratar de proteger nossas páginas de SQL injections. Aquelas instruções maliciosos que os nossos "amigos" programadores de má índole ficam inserindo em nossas bases.

Bom. É uma validação simples. E temos que fazer isso, senão eles ficam como programadores de má índole e nós como de meia tijela.

Bom, o código é simples, segue o SQL do banco para levantarem uma base simples de teste. Vide em anexo.
SCRIPT DO BANCO
CREATE DATABASE `sqlmal`;

USE `sqlmal`;

CREATE TABLE `usu` (
  `usu` varchar(8) NOT NULL default "",
  `senha` varchar(255) default NULL,
  PRIMARY KEY  (`usu`)
) TYPE=MyISAM;

INSERT INTO `usu` VALUES ("josimar","senha");
INSERT INTO `usu` VALUES ("usuario","123");
INSERT INTO `usu` VALUES ("sql","mal");
E abaixo o código em PHP para explicar e testar a solução, veja as explicações das linhas.

$sql="select senha from usu where usu="".$_POST["txt_usu"]."";";
Seleciono a senha do usuário que ele informou, se ele tiver digitado por exemplo " or "1 vai trazer todo mundo.

$qnt=count($res);
Conto quantos registro foram selecionados no sql. Aqui é a chave do negocio pois SQL injections em sua maioria trazem muitos registros da base

if (($res[0]==$_POST["txt_pass"])&&($qnt==1))
A pérola e a validação estão aqui. A senha que eu trouxe da base tem que ser igual ao que o cara digitou (tchau SQL maldoso) e se a consulta me retorna apenas um registro. Se isso aconteceu é por que não é SQL malicioso ou é um bem feito...(RISOS) pois estamos num mundo que as soluções de segurança evoluem rápido. Mas os problemas de segurança mais rápidos ainda.

Espero que tenha sido de proveito a vocês. Até o próximo...
FONTE DA PÁGINA EM PHP (antisqlinjection.php)
<?php
 //Copnecto-me ao banco
 $servidor="localhost";
 $usuario_bd="root";
 $senha_bd="";
 $banco="sqlmal";
 $con=mysql_connect($servidor, $usuario_bd, $senha_bd);
 mysql_select_db($banco,$con);
 //Desenvolvimento da página
 //Testo se não existe USUARIO E SENHA no POST
 if ((!isset($_POST["txt_usu"]))&&(!isset($_POST["txt_pass"]))) 
 { //Caso não exista mostro o formulário para entrada de dados
  ?>
  <form method="POST" action="antisqlinjection.php">
   <center>
    <h1>Informe Usuário e Senha Para ter Acesso ao Sistema XPTO</h1>
    <b>Usuário</b><input type="text" size="20" name="txt_usu"><BR>
    <b>Senha</b><input type="password" size="20" name="txt_pass"><BR><BR>
    <input type="submit" value="Entrar">
    <input type="reset" value="Limpar">
   </center>
  </form>
  <?php
 }
 else
 {
  if (($_POST["txt_usu"]=="")||($_POST["txt_pass"]==""))
  { //testo se uma das variaveis veio em branco
   ?>
    <center>
    <h1><font color="#FF0000">Dados Incorretos</font></h1><BR><BR>
    <a href="antisqlinjection.php">Voltar</a>
    </center>
   <?php
  }
  else
  {
   $sql="select senha from usu where usu="".$_POST["txt_usu"]."";";
   $qry=mysql_query($sql,$con);
   $res=mysql_fetch_row($qry);
   $qnt=count($res);
   if (($res[0]==$_POST["txt_pass"])&&($qnt==1))
   {
    ?>
    <center>
    <h1>LOGADO</h1><BR>
     Se você entrou com SQL injection me ensine o que fez. josimarfinamore@gmail.com
    <BR><BR>
    <a href="antisqlinjection.php">Voltar</a>
    </center>
    <?php
   }
   else
   {
    ?>
    <center>
    <h1>ERRO</h1><BR>
     Esta página trata os SQL injection mais comuns. qualquer dúvida josimarfinamore@gmail.com
    <BR><BR>
    <a href="antisqlinjection.php">Voltar</a>
    </center>
    <?php
   }
  }
 }
?>
Josimar Finamore

Josimar Finamore