You are on page 1of 7

SQL Injection no PHP: O que e como se proteger iMasters

Abril.com

PORTAL

AGENDA

Mais sites Abril

MULTIMDIA

Grupo Abril

COLETIVOS

IMASTERS PRO

CODE

Abril Mdia

FRUM

Pgina 1 de 7

Distribuio

Grfica

Abril Educao

Assine

Loja

Faa Login / Cadastre-se

INTERCON 2011

PHP

PHP

SQL Injection no PHP: O que e como se proteger


Tera-feira, 05/12/2006 s 13h24, por Tiago Vailati

A segurana das informaes um assunto que exige ateno especial, principalmente em


se tratando de informaes armazenadas em bancos de dados acessados via web.
Uma das tcnicas de fraude mais conhecida pelos desenvolvedores web a SQL Injection.
Trata-se da manipulao de uma instruo SQL atravs das variveis quem compem os
parmetros recebidos por um script server-side, tal como PHP, ASP, ColdFusion e outros.
O principal motivo pelo qual deve-se impossibilitar a utilizao da SQL Injection est no
fato de que, atravs de uma simples instruo SQL, como por exemplo, uma projeo de
dados, outras operaes podem ser executadas, podendo impactar sobre o esquema das
tabelas, os dados armazenados, e at mesmo sobre elementos do sistema operacional,
tendo em vista que alguns bancos de dados permitem a execuo de comandos do shell
do prprio sistema operacional.
Detectando a vulnerabilidade de um sistema
Para ilustrar o conceito de SQL Injection, a seguinte simulao pode ser realizada.

WHITE PAPERS

Imaginemos que um script de validao de acesso de usurios tenha sido desenvolvido


como segue:

ITIC Survey
Veja em relatrio ITIC por que clientes Oracle
esto insatisfeitos
Uma pesquisa revelou que 2 entre 10 clientes acham
pobre e insatisfatrio os produtos, servios e suporte
da Oracle.

LTIMAS NOTCIAS

Nas linhas 3 e 4, as variveis $usuario e $senha, respectivamente, recebem o contedo


submetido por um formulrio atravs do mtodo POST. Eis a fonte do problema.
Suponha que a seguinte entrada tenha sido informada no campo usurio no formulrio
chamador do script de validao.

10h25

Bug no PHP pode derrubar


servidores
14h30

Lanado PHP 5.2.13


17h46

Facebook reescreve PHP e pode


estar desenvolvendo compilador
para a linguagem
11h44

PHP 6 ter suporte para Unicode


Logo, a query string resultante ser:

13h20

PHP 5.3 chega na prxima tera


VER MAIS NOTCIAS

CURSOS ONLINE

Se nenhuma outra validao for realizada, o usurio mal intencionado ter efetuado login
no sistema, sem ao menos informar um usurio contido na tabela. Isto foi possvel pois o
valor de entrada informado no recebeu o tratamento devido, sendo adicionado instruo

http://imasters.com.br/artigo/5179/php/sql_injection_no_php_o_que_e_e_como_se_pr... 17/08/2011

SQL Injection no PHP: O que e como se proteger iMasters

Pgina 2 de 7

para ser executado. Vale ressaltar que as validaes apresentadas no exemplo so


apenas ilustrativas, havendo a necessidade de checagens mais eficazes para um script de
validao de acesso.
Impossibilitando o uso de SQL Injection
Para que se esteja livre da utilizao da SQL Injection, certas providncias devem ser

Redes e protocolo TCP/IP

tomadas. Algumas das aes sero realizadas no servidor de banco de dados, outras

Este curso apresenta os conceitos fundamentais de


redes de computadores, discutindo as caractersticas
das principais tecnologias de LAN e de WAN.

devem ser garantidas pelo cdigo fonte.


Deve-se tomar cuidado com a configurao do usurio que estabelece a conexo com o
banco de dados. O ideal que as permisses de acesso deste usurio estejam
restritamente limitadas s funes que ir realizar, ou seja, para a exibio de um relatrio,
a conexo com o banco de dados deve ser realizada por um usurio com permisses de
leitura e acesso somente s tabelas necessrias para sua operao.
Todos os valores originados da coleta de dados externos, devem ser validadas e tratadas a
fim de impedir a execuo de eventuais instrues destrutivas ou operaes que no
sejam as esperadas.

Introduo ao desenvolvimento para iOS


Apresentao das ferramentas de desenvolvimento
para aplicativos para iOS (Xcode, Interface Builder, iOS
Simulator), como consegu-las e como us-las.

Um tratamento bsico para a execuo de querys com variveis contendo valores


informados pelo usurio:

Gerenciamento de contedo com WordPress


O uso do WordPress cresce a cada dia. Aprenda a
inserir e gerir contedo em sites e blogs que usam esse
CMS e garanta o seu diferencial no mercado digital.

Encontre-nos no Facebook

iMasters
Curtir

Com a utilizao da funo addslashes() ser adicionada uma barra invertida antes de

5,675 pessoas curtiram iMasters.

cada aspa simples e aspa dupla encontrada, processo conhecido como escape. Se a
diretiva de configurao do PHP magic_quotes_gpc estiver ativada, o escape realizado
automaticamente sobre os dados de COOKIES e dados recebidos atravs dos mtodos

Ricardo Luiz

Amauri

Alessandra

Sou Mais

Pedro

Deide

Jos

DjMark

Daniela

Patricia

GET e POST. Neste caso, no deve ser efetuado o tratamento com addslashes(). A
funo get_magic_quotes_gpc(), disponvel nas verses do PHP a partir da 3.0.6, retorna
a configurao atual da diretiva magic_quotes_gpc.
Abaixo, a query string resultante da aplicao do tratamento mencionado:

Em muitos bancos de dados, existem funes especficas para o tratamento de variveis


em query strings, o que diminui a compatibilidade do cdigo fonte para operao com
outros sistemas de banco de dados.
Outra dica importante evitar a exibio das mensagem de erro em um servidor de
aplicao em produo, pois geralmente nos erros ou alertas so exibidos caminhos de
diretrios do sistema de arquivos e informaes respeito do esquema do banco de
dados, podendo comprometer a segurana do sistema.
Para ocultar a exibio de erros e alertas do PHP, necessria a configurao da diretiva
display_errors para Off no arquivo de configuraes do PHP.
Cabe ao desenvolvedor estar atento s possveis brechas de segurana existentes nos
cdigos fonte que produz, principalmente quando o que est em jogo um bem de grande
valia: a informao. Tenha conscincia. Isto evita futuras dores de cabea e atritos
desnecessrios com o cliente.

Hospede PHP na Hospedagem 2.0, suporte ao PHP 5.2 e 5.3. Experimente Grtis por 15 dias!
0
0
Like

Send

http://imasters.com.br/artigo/5179/php/sql_injection_no_php_o_que_e_e_como_se_pr... 17/08/2011

SQL Injection no PHP: O que e como se proteger iMasters

Pgina 3 de 7

Tiago Vailati bacharel em Cincia da Computao pela Univali (SC). Tem interesse nas reas
de software, web, bancos de dados, tambm administrao e empreendedorismo. Alm disso,
gosta de msica, ler, escrever, e acompanhar o mercado.
Pgina do autor
Email
Website
Leia os ltimos artigos publicados por Tiago Vailati
O que impede nossos projetos de seguirem em frente?
De mos dadas com a TI
Scrum: utilize linguagem de negcios no Product Backlog
Filosofia gil: Getting Real - Parte final
Filosofia gil: Getting Real - Parte 02
Filosofia gil: Getting Real - Parte 01

31 COMENTRIOS

COMENTE TAMBM

Diego A. Griep
J conhecia o assunto, mas sempre bom ler a viso de outras pessoas, bom se proteGer
do sql injection.
* Dica:
Quando for postar um artigo, tenha sempre um dicionrio ao lado.
[ ]'s
H 4 anos Responder

Rafael Capucho
Eu gostaria de saber se assim tambm possivel um Injection: WHERE senha = '".$senha."';
espero respostas, Obrigado.
H 4 anos Responder

Luis Fernando D. Andrade


Ola, gostei da sua materia e parabens pela iniciativa de falar sobre seguranca embora que
bem superficialmente ;).
Uma funcao muito boa 'anti sql injection' foi criada pelo Fabyo, aqui:
http://forum.imasters.com.br/index.php?showtopic=125349&hl=sql injection
Parabens e que voce continue abordando temas relacionados a essa materia.
[]s
Luis
H 4 anos Responder

Igor Escobar
Tem gente que gosta de voltar no tempo...
H 4 anos Responder

DANIEL MAFFIOLETTI
Sem dvida que este assunto importante para iniciantes. Existem vrios mtodos
relacionados!
H 4 anos Responder

Cleison Pinter Baldin


Outra forma de tratar o uso do SQL Injection, obrigar o usurio a digitar login e senha, pois
desta forma ninguem consegue submeter a pagina sem as dias informaes.
Tambm utilizar criptografia na senha muito interessante.
H 4 anos Responder

Ana Claudia Nogueira


Muito legal a sua iniciativa de falar sobre sql injection, mas ficou um pouco resumido, poderia
ter sido falado mais sobre outros modos de injection
H 4 anos Responder

Tiago Vailati
Pessoal, tudo certo? Como foi abordado no artigo, hoje em dia, o prprio PHP j possui
tratamento para dados recebidos via POST, GET e Cookies. Logo, a utilizao da SQL
Injection tem sido bastante dificultada. O artigo visa explanar sobre o conceito e como a SQL
Injection atua, por isso, foi tratada numa viso mais superficial.
H 4 anos Responder

http://imasters.com.br/artigo/5179/php/sql_injection_no_php_o_que_e_e_como_se_pr... 17/08/2011

SQL Injection no PHP: O que e como se proteger iMasters

Pgina 4 de 7

Larcio Crestani
Seria um pouco melhor um
<?
if(!isset($_POST['usuario']) || trim($_POST['usuario']) =='' || !isset($_POST['senha']) || trim
($_POST['senha'] =='')){
header('location:login.php');
exit;
}
else {
echo $_POST['usuario'];
echo $_POST['senha'];
};
?>
se chegar '' vazio, ele volta ai seno ele continua... um pouco mais lgico e precisa dea
verificao ON em magic_quotes_gpc no php.ini...
H 4 anos Responder

Anderson Cavalcante
Boa a matria,
So poucos os programadores que pensam na questo: "Segurana". Por isso tantas falhas.
Algo muito bom de utilizar, so as expresses regulares. Onde voc especifica o que o
campo poder aceitar de caracter. Neste caso, entraria de a-z, A-Z, 0-9. Nada mais do que
isso, dae no teria problema de substituir por contra barra para escapar o caracter. Por
exemplo, posso utilizar o caracter #, que iria comentar o restante do cdigo SQL ;)
Abraos
H 4 anos Responder

Thiago Ferreira
O artigo no trouxe nada de novo. Explicaes manjadas da web. Acho que preciso trazer
alguma coisa realmente nova ou nem escrever nada.
H 4 anos Responder

Admir Tomaz
Serve apenas para novatos, sendo que o perigo do injetion nem foi falado, o perigo quando
fica vulnervel a ter uma tabela toda deletada pelo "drop", at um "select" de uma busca mal
programada pode gerar uma perda enorme de dados.
H 4 anos Responder

rico Gustavo Kmetzsch


eu custumo usar a funcao do php htmlspecialchars() filtrando as variaveis que recebem
valores do metodo POST ou GET
H 4 anos Responder

Kenneth becker carletto


Nao sei se esta tecnica eh muito comum, mas eu costumo usar a funcao md5($str) para
login. Ela transforma $str em uma chave criptografada.
Quando cadastro usuario, salvo no banco a senha criptografada. Como esta funcao nao
permite volta (nao existe um desfaz_md5()), utiliza-se a funcao tambem na senha passada
por post, na ocaisao do login.
Acredito que este procedimento evite o problema do injection.
H 4 anos Responder

Juliano dos Santos da Silva


Ae galera to gostanu at pq eu sou um novato msm na area e tento o melhor q eu posso
nunca tem ninguem pra dar uma mozinha sabem como
ae galera tipo se tive alguem a fim de me tirar uma duvida me add ae no msn:
kcd_cs@hotmail.com
vlw gente fica cum DEUS
H 4 anos Responder

Tiago Gouva
Outra maneira de "limitar" as entradas de dados utilizando typecast, convertendo assim
uma entrada obtida $_POST ou $_REQUEST em um tipo determinado.
Uma maneira : $codigo=(int) $codigo;
Outra pode ser:
settype($codigo,integer);

http://imasters.com.br/artigo/5179/php/sql_injection_no_php_o_que_e_e_como_se_pr... 17/08/2011

SQL Injection no PHP: O que e como se proteger iMasters

Pgina 5 de 7

Saudaes
H 4 anos Responder

Leonardo Cesar Teixeira


A funo addslashes() meio ultrapassada e eu no vejo porque em utilizada se tem uma
funo especfica do PHP pra escapar aspas simples e duplas.
No caso de um simples login o addslashes() pode quebrar um galho, mas na caso de
insero de dados o addslashes() ir estragar os textos mandando eles pro banco de daodos
com barras invertidas.
Ento j que este site uma das principais guias para os programadores do Brasil, eu no
acho certo ensinar como evitar um problema de segurana utilizando o pior mtodo.
A melhor funo para evitar ataques de SQL Injection usando a funo
mysql_real_escape_string(), ela ir escapar os dados apenas na hora da consulta e no banco
de dados no ir ficar com as barras invertidas.
Eu fiz um artigo em meu blog explicando como se proteger de ataques de SQL Injection de
forma eficaz e sem "destruir" os dados. E tambm tem um tutorialzinho ensinando a criar uma
funo para proteger seus scripts contra este ataque.
Para lr o artigo acesse o endereo abaixo:
http://blog.portaldoleo.com/2007/08/28/como-evitar-ataques-de-sql-injection-no-php-e-mysql/
Mas esse artigo do Imasters est muito bom pras pessoas terem uma idia de como ocorre
um ataque de SQL Injection.
Abraos!
H 3 anos Responder

Maurcio Reatto Duarte


Nossa, eu tava tendo este problema, da no lembrava mais como usar o anti sql-injection
Dai essa vlw ein !!
H 3 anos Responder

Moacir Fernandes
Pelo que percebi, voc est dando o select validando o login e senha de escape, para que
serve ento o login e senha se no est sendo usado!
H 3 anos Responder

Daniel Neto
um complemento do firefox que possibilita injetar codigo em qualquer campo do formulario,
esta ferramenta muito usada por hackers, a ferramenta pode ser baixada aqui:
https://addons.mozilla.org/pt-PT/firefox/addon/6727
H 3 anos Responder

Leo Baiano
Concordo com o Leonardo, eu tambm acho que o mysql_real_escape_string() uma
soluo mais atual e melhor para proteo contra sql injection.
Normalmente utilizo a seguinte funo:
function anti_sql_injection($string){
$string = get_magic_quotes_gpc() ? stripslashes($string) : $string;
$string = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($string) :
mysql_escape_string($string);
return $string;
}
H 1 ano Responder

Jo?Jorge Ol leo, como utiliso essa funo pra me proteger


H 8 meses

Responder

thiago
duvido alguem derrubar meu banco.
dou 10000
H 11 meses Responder

Joo Se ele est em um pc conectado internet no impossvel. Por mais


protegido que esteja, no impossvel......a no ser que esteja isolado.
No nada fcil, ainda mais hoje que os sistemas esto com a segurana cada vez

http://imasters.com.br/artigo/5179/php/sql_injection_no_php_o_que_e_e_como_se_pr... 17/08/2011

SQL Injection no PHP: O que e como se proteger iMasters

Pgina 6 de 7

mais elevanada, mas no impossvel. Se ainda assim acredita que est imune, sinto
muito mas voc precisa atualizar seus conceitos.
H 11 meses

Responder

Lohan
eu gostei boa matria!!!!!!
H 8 meses Responder

Marcus
Prabns pelo artigo.
H 8 meses Responder

Marcos Knijnik
S para avisar que o addslashes apenas funciona caso estejamos falando de string. Porm,
caso estejamos lidando com nmeros, uma outra histria...
Por exemplo:
<?php
$id = $_GET['id']; // um nmero
$query = "SELECT * FROM tabela WHERE id=$id";
?>
A nem addslashes resolve. Imagina que o cara digite "DROP tabela". A l se vai nossa
querida tabela...rs
Para impedir Sql Injection com nmeros, acho que isso basta:
<?php
$id = 0 + $_GET['id'];
?>
E isso , aliis, bem interessante, pois o PHP realiza essa converso automaticamente
(http://www.php.net/manual/pt_BR/language.types.string.php#language.types.string.conversio
n). Ou seja, ele ir adicionar 0 id recebida. Caso esta seja "0 DROP tabela", ela excluir
tudo que segue um caracter no-numrico, no caso o espao, e " DROP tabela" deixaria de
existir...
Att.
Marcos Knijnik
H 7 meses Responder

Leonir
Segue aqui um completinho, no fiz orientado a objetos:
$recebe = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show
tables|update|declare|exec|set|cast|$|#|%|&|'|\"|`|;|\*|--|\\\\)/"),"",trim(addslashes
(htmlspecialchars(strip_tags($_POST['recebe_formulario'])))));
isso foi perfeito para mim, limparam minha base de dados, depois tive de implantar esta
segurana
H 4 meses Responder

Gstv.inc
aqui uma funcao simples
http://www.w3schools.com/PHP/func_mysql_real_escape_string.asp
<?php
function check_input($value)
{
// Stripslashes
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// Quote if not a number se NAO FOR NUMERO
if (!is_numeric($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
$con = mysql_connect("localhost", "peter", "abc123");

http://imasters.com.br/artigo/5179/php/sql_injection_no_php_o_que_e_e_como_se_pr... 17/08/2011

SQL Injection no PHP: O que e como se proteger iMasters

Pgina 7 de 7

if (!$con)
{
die('Could not connect: ' . mysql_error());
}
// Make a safe SQL
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";
mysql_query($sql);
mysql_close($con);
basta adicionar o check_input() com seu post dentro e ele faz o resto
espero ter ajudado
H 3 meses Responder

Victor Hugo Lopes


Bom post amigo,
Foi bem til.
H 3 meses Responder

LOL
usem PDO.
H 2 meses Responder

QUAL A SUA OPINIO?

PARCEIROS

2001 iMasters FFPA Informtica Ltda


Todos os direitos reservados.

http://imasters.com.br/artigo/5179/php/sql_injection_no_php_o_que_e_e_como_se_pr... 17/08/2011

You might also like