Vous êtes sur la page 1sur 23

bemvindo

Baixe o APP
Assine MVP
Guias de Referncia
Cursos & Sries
ltimas Atualizaes
o ltimas Atualizaes
o Voltar
o Front-end web
o Mobile
o Java
o .net
o Banco de dados

o Engenharia de Software
o Delphi
o Canal Mais
DevCast
Artigos
Revistas
o Revistas
o Voltar
o Front-end Magazine
o Mobile magazine
o Java Magazine
o easy Java Magazine
o .net Magazine
o easy .net Magazine

o SQL Magazine
o Clube Delphi
o Infra Magazine
o Engenharia de Software
o Assine revistas
Servios
o Servios
o Voltar
o Cadastre-se
o RSS
o APIs
o RECOMENDADO
Frum
Fale conosco

DevMedia
Iniciar
o Guias de Referncia
o Cursos & Sries
o ltimas atualizaes
Front-end web
Mobile
Java
.net
Banco de dados
Engenharia de Software
Delphi
Canal Mais
o DevCast

Vdeos de Front-end web


Vdeos de Mobile
Vdeos de Java
Vdeos de .NET
Vdeos de Banco de dados
Vdeos de Engenharia de Software
Vdeos Canal Mais
Todos os DevCast
o Artigos
Artigos de Front-end web
Artigos de Mobile
Artigos de Java
Artigos de .NET
Artigos de Banco de dados

Artigos de Engenharia de Software


Artigos Canal Mais
Todos os artigos
o Frum
o Recomendado
Assine MVP
Baixe o APP
Login
1

OK Cadastre-se Esqueci minha senha

favorito (3) imprimir anotar marcar como lido tirar dvidas


SQL Injection em ambientes Web

Segurana um aspecto que muitas vezes deixado de lado em detrimento


a outros, tornando na maioria das vezes um site vulnervel a sql injection.
Voc precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download voc precisa estar logado. Clique aqui para efetuar o
login
(opcional) Onde podemos melhorar?
9733

Confirmar voto
0
(3) (0)
Por: Clvis Luiz de Amorim Filho, Paulo Diego de Oliveira Bezerra
Cavalcanti, Marcello Benigno de Barros Borges Filho.

1. Introduo

Segundo Duarte (2007), nas ltimas dcadas observou-se um aumento


expressivo no desenvolvimento de tecnologias computacionais. Entretanto,
toda esta evoluo acompanhada por um nmero crescente de sistemas
sendo sondados, invadidos, infectados, comprometidos e utilizados para
gerar ataques a outros sistemas. Todos estes problemas de segurana
fazem parte do cotidiano de instituies, e de usurios domsticos. Desta
forma, observa-se que a segurana um aspecto muito importante, seja
para o desenvolvimento desktop ou para o ambiente web.
Em um mercado onde requisitos mudam constantemente e o fator
produtividade sempre primordial, alguns aspectos acabam sendo
desconsiderados, sendo a segurana um requisito quase sempre esquecido
ou colocado em segundo plano. No entanto, as conseqncias geradas por
esta prtica quase sempre so desastrosas quando as aplicaes entram
em produo.
Em se tratando de aplicaes web, a segurana um fator de grande
importncia, j que a aplicao fica disponvel em qualquer parte do mundo
e passvel de manipulao pelos mais diversos usurios, alm de tambm
estar passvel aos mais diversos ataques.

Os ataques esto cada vez mais sofisticados e sempre se


aproveitando do grande nmero de falhas presentes nas aplicaes. Podem
ser destacados alguns tipos de ataques como: url manipulation, web
session hijaking e SQL injection.
Motivados pela observao do grande nmero de sites em produo
que possuem falhas em relao a segurana, este artigo ter como foco os
ataques do tipo SQL injection, visto a sua simplicidade e em contrapartida
os grandes problemas que o mesmo pode trazer.

2. SQL Injection
Em um cenrio onde existem informaes armazenadas em bancos de
dados e que podem ser acessados via web, tem-se a possibilidade do
ataque do tipo SQL injection. SQL injection um tipo de ataque muito
simples, que baseia-se na execuo de comandos SQL, sejam comandos de
manipulao de dados - DML (select, insert, update, delete) ou comandos de
definio de dados - DDL (create, drop, alter). Estes comandos so
executados atravs das entradas de formulrios web, ou seja, no local

destinado para digitao de informaes pelo usurio, onde so passados


comandos SQL, que por falhas nas aplicaes acabam por resultar em
alteraes no banco de dados ou no acesso indevido aplicao.
A figura 1 apresenta um exemplo clssico de tal prtica numa tela de
autenticao:

Figura 1 Exemplo SQL injection


O problema ocorre devido a autenticao do usurio ser validada
internamente pela aplicao com a seguinte instruo, que verifica se existe
um usurio com o respectivo login e senha:

SELECT * FROM tabela_usuarios WHERE login = 'campo_login' AND senha =


'campo_senha'
Normalmente, seriam digitados o login e a senha, que resultaria em
uma consulta ao banco de dados para verificar se os mesmos conferem mas
na figura acima foi passado parte de um comando SQL no campo reservado
para senha, que internamente resultar na seguinte instruo:

SELECT * FROM tabela_usuarios WHERE login = '123' AND senha = ' ' or '1' =
'1'
Observe que o comando passado no campo da senha fez com que
independente do login e senha informados, a condio seja sempre
verdadeira, permitindo assim o acesso do usurio aplicao sem o mesmo
possuir a devida permisso.

Existem diversas possibilidades de comandos que podem ser


executados indevidamente atravs da passagem de parmetros, onde
alguns exemplos podem ser observados na tabela 1:

SQL esperado

Parmetros informados

SQL resultante

Comantrio

SELECT * FROM
tabela_usuarios
WHERE login =
'marcos';--' AND
senha =
'campo_senha'

Se o usurio
j souber o
login (no
caso, login do
usurio
marcos)
ento
consegue
logar sem
senha, j que
os caracteres

Campo_login Campo_senha
SELECT *
FROM
tabela_usuarios
WHERE login =
'campo_login'
AND senha =
'campo_senha'

marcos;--

-- so
comentrios
no SQL
' OR 1=1 --

SELECT * FROM
tabela_usuarios
WHERE login = ''
OR 1=1--' AND
senha =
'campo_senha'

Neste caso,
no
necessrio
saber nem o
login nem a
senha, pois a
condio OR
1=1 sempre
vai ser
satisfeita e
todos os
comandos
posteriores
so
comentados
pelos

carecteres
--
123'; DROP
TABLE
produtos; --

SELECT * FROM Este caso


tabela_usuarios muito
WHERE login = parecido com
'123'; DROP
o primeiro
TABLE
mas um
produtos;-- ' AND comando
senha =
para apagar
'campo_senha' uma tabela
executado
antes do
comentrio.
Na verdade
aqui o
objetivo era
somente
apagar a
tabela, por

isso foi
passado um
login
qualquer.
Tabela 1 Passagem de parmetros SQL injection

Apesar desse tipo de ataque poder ocasionar grandes danos ao


banco de dados, ele pode ser evitado apenas com boas prticas de
programao, independente da linguagem. Em seguida sero abordadas
formas de preveno na linguagem PHP e JAVA.

3. Preveno do SQL Injection na linguagem PHP


De acordo com Alves (2007), para se proteger da utilizao da SQL Injection,
certas providncias devem ser tomadas. Algumas das aes sero

realizadas no servidor de banco de dados, outras devem ser garantidas pelo


cdigo fonte.
Ainda de acordo com o mesmo autor, 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
validados e tratados a fim de impedir a execuo de eventuais instrues
destrutivas ou operaes que no sejam as esperadas.
Um tratamento bsico para a execuo de querys com variveis
contendo valores informados pelo usurio (ALVES, 2007):
$usuario = $_POST['usuario'];$senha = $_POST['senha'];$usuario_escape =
addslashes($usuario);$senha_escape = addslashes($senha);$query_string =

"SELECT * FROM usuarios WHERE codigo = '{$usuario_escape}' AND senha


= '{$senha_escape}'";?>
Atravs da funo addslashes() ser adicionada uma barra invertida
antes de 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 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:
SELECT * FROM usuarios WHERE codigo = '' AND senha = '\' or 1=\'1'
Deve-se tambm evitar a exibio das mensagens 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.

4. Preveno do SQL Injection na linguagem JAVA


Quando uma aplicao JAVA usa consultas Statement, ou seja, consultas
onde a string SQL concatenada com os parmetros e assim executada, ela
provavelmente ter problemas com SQL injection. Como ocorre no trecho de
cdigo a seguir:

String sql = "select * from tabela_usuarios where login='" + campo_login +"'


and senha='" + campo_senha + "'";
Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery(sql);
if (rs.next())
System.out.println("Usurio Logado com sucesso.");
else
System.out.println("Usurio ou Senha no conferem.");
De acordo com a OWASP (2008), uma forma simples do SQL injection
ser evitado, quando utilizada a linguagem JAVA, realizar a validao das
entradas, de forma que sejam evitados caracteres que no faam parte do
conjunto de caracteres das entradas (inputs) e utilizar consultas Prepared
Statement, ou seja, os parmetros no so concatenados, a string SQL
define parmetros:
String sql = "SELECT * FROM tabela_usuarios WHERE login = ? AND senha
= ?";
PreparedStatement prepStmt = con.prepareStatement(sql);
prepStmt.setString(1,login);

prepStmt.setString(2,senha);
ResultSet rs = prepStmt.executeQuery();
Assim, variveis passadas como prepared statement faro o escape
automaticamente, da mesma forma como exposto na linguagem PHP.

5. Consideraes Finais
Sistemas Desktop e Web ainda permanecem como alvos vulnerveis, apesar
da disponibilidade de ferramentas e de procedimentos que dificultam a
ocorrncia de ataques. A fragilidade desses sistemas muitas vezes
potencializada pelo desconhecimento que os programadores possuem
sobre a programao segura e tambm sobre os cenrios nos quais esses
ataques ocorreram e foram bem sucedidos.
Assim, este trabalho apresentou alguns procedimentos que visam
auxiliar a construo de aplicaes seguras sob o ponto de vista dos
ataques provocados pela SQL injection.

6. Referncias Bibligrficas
Assad, Rodrigo. Falhas em aplicaes (Especializao em desenvolvimento
web UNIBRATEC - 2008).
Alves, G. SQL Injection no PHP. Disponvel em: Acesso em 01/04/2008.
Duarte,. L. O..Desenvolvimento de um ambiente para anlise de cdigosfonte com nfase em segurana. So Jos dos Campos: INPE, 2007.
OWASP. Community focused on improving the security of application
software. Disponvel em : Acesso em: 3 maio. 2008.
Publicado no Canal Mais
por Clvis Amorim
Programador apaixonado
Voc precisa estar logado para dar um feedback. Clique aqui para efetuar o login

Ajude-nos a evoluir: voc gostou do post? (3) (0)


(opcional) Onde podemos melhorar?
9733

Confirmar voto
Compartilhe:
Ficou com alguma dvida?
Post aqui sua dvida ou comentrio

Mais posts
Video
BigData - Manipulando arquivos de texto grandes
What is new
Os 10 posts mais legais de Maio

DevCast
Bootstrap ou Materialize?
What is new
Novidade: Gamification DevMedia
E-Book/Apostila
Guia de Referncia DevMedia
Listar mais contedo
Publique | Assine | Fale conosco

Hospedagem web por Porta 80 Web Hosting

Vous aimerez peut-être aussi