http://skamason.com/7b9R

http://skamason.com/7b9R

quarta-feira, 23 de maio de 2012

SQL Injection (A moda hoje em dia)

Hoje em dia essa vulnerabilidade que não é coisa nova, é uma das mais exploradas e a mais famosa que vejo hoje, realmente tomou a vez do clássico RFI pois não é encontrado com tanta frequência. A injeção de SQL pode ser explorada tanto via POST ou GET, exemplo prático ela pode ser explorada em formulários de login ou também via URL quando é passado um parâmetro para a pesquisa, agora irá entrar a parte de tipos de dados que vão ser passados pois isso pode acarretar o famoso injeção de SQL.




Temos n formas de corrigi-la, vou citar um código vulnerável que utilizei na minha outra matéria sobre proteção de SQL Injection.
<?php //inicio do php

 //Fazer conexão com o banco

 $conexao = mysql_connect("endereço do banco", "login", "senha")
 or die ("Erro na conexão ao banco de dados.");
 $db = mysql_select_db("site")//Seleciono a base de dados no caso (site)
 or die ("Erro ao selecionar a base de dados.");
          $id=$_GET['id'];
 $resultado = mysql_query("SELECT * FROM noticias WHERE id=$id", $conexao);
 while($linha = mysql_fetch_array($resultado, MYSQL_ASSOC)){
           echo $linha['texto'];
           echo "<br/>"; 

 }
?>
Nesse exemplo irei mostrar como tratar a vulnerabilidade quando os dados passados são via GET. Podemos utilizar o cast para indicar o tipo do dado passado ou da função mysql_real_escape_string(), essa função nos permite trabalhar com os tipos de dados que serão passados vejamos esse exemplo.
<?php 
 $conexao = mysql_connect("endereço do banco", "login", "senha")
 or die ("Erro na conexão ao banco de dados.");
 $db = mysql_select_db("site")//Seleciono a base de dados no caso (site)
 or die ("Erro ao selecionar a base de dados.");
          $id=$_GET['id'];
 $sql = sprintf("SELECT 
            *
      FROM 
            noticias 
      WHERE
            id='%s'",mysql_real_escape_string($id));
$resultado=mysql_query($sql);
while($linha = mysql_fetch_array($resultado, MYSQL_ASSOC)){
           echo $linha['texto'];
           echo "<br/>"; 

 }
?>
Usando essa função tratamos qualquer caractere inválido será tratado. Isso é muito útil em telas de login pois lá devemos redobrar o cuidado. Havia citado sobre o cast, bem quando for utilizar de por exemplo um portal de notícias para exibi-las eu até recomendo o cast pois irá economizar nos códigos. Veja o exemplo bastante simples:
<?php 
 $conexao = mysql_connect("endereço do banco", "login", "senha")
 or die ("Erro na conexão ao banco de dados.");
 $db = mysql_select_db("site")//Seleciono a base de dados no caso (site)
 or die ("Erro ao selecionar a base de dados.");
          $id=(int)$_GET['id'];
 $sql = "SELECT 
            *
      FROM 
            noticias 
      WHERE
            id=$id";
$resultado=mysql_query($sql);
while($linha = mysql_fetch_array($resultado, MYSQL_ASSOC)){
           echo $linha['texto'];
           echo "<br/>"; 

 }
?>
E um último exemplo para tratar telas de login completo:
<?php
if (isset($_POST['login'])&&(isset($_POST['login']))){
$conexao = mysql_connect("endereço do banco", "login", "senha")
or die ("Erro na conexão ao banco de dados.");
$db = mysql_select_db("site")//Seleciono a base de dados no caso (site)
or die ("Erro ao selecionar a base de dados.");
$login=$_POST['login'];
$senha=$_POST['senha'];
$sql = sprintf("SELECT
*
FROM
usuarios
WHERE
user='%s' AND senha='%s'",mysql_real_escape_string($login),mysql_real_escape_string($senha));
$resultado=mysql_query($sql);
while($linha = mysql_fetch_array($resultado, MYSQL_ASSOC)){
echo $linha['texto'];
echo "<br/>";
}
}
?>
 
By: R410X 

Nenhum comentário:

Postar um comentário