Baixar este arquivo PDF

Propaganda
Caderno de Estudos Tecnológicos
DESENVOLVIMENTO SEGURO COM BANCO DE DADOS
RELACIONAL E STORED PROCEDURE NO AMBIENTE WEB
UTILIZANDO MYSQL E PHP
Fulvio F. Neto1, Luis A. da Silva1, Matheus M. Pereira1, Rafael B. Felício1
1
Faculdade de Tecnologia (FATEC) – Bauru, SP - Brasil
{fulvio.neto, matheus.pereira, luis.silva51, rafael.felicio} @fatec.sp.gov.br
Abstract. This article presents a study of vulnerabilities related to SQL injection in
MYSQL database systems developed in PHP and ways to prevent them. The
methodology consists of building an unsafe environment, susceptible to attacks and
other safe, armored with security checks. Where simple actions in the database can
solve the problem of such vulnerabilities and thus inhibit malicious attacks.
Resumo. Este artigo apresenta um estudo sobre as vulnerabilidades relacionadas à
injeção de SQL em banco de dados MYSQL em sistemas desenvolvidos em PHP e as
maneiras de preveni-las. A metodologia adotada consiste na construção de um
ambiente inseguro, passível de ataques e outro ambiente seguro, blindado com
verificações de segurança. Onde ações simples no banco de dados podem sanar o
problema de tais vulnerabilidades e dessa forma inibir ataques maliciosos.
1. Introdução
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Página
Dessa forma, é importante levantar ações que podem ser aplicadas ao banco de dados,
no caso o MYSQL, para evitar os ataques do tipo SQL Injection.
48
A internet tem se popularizado muito nos últimos anos, e o acesso a sistemas de informação
através da internet não é mais exclusividade de ambientes acadêmicos e governamentais,
tornando-se presente no cotidiano do público em geral. Ações comuns como troca de
mensagens (e-mails, bate-papo, redes sociais, entre outras), pagamento de contas ou mesmo
consultas a bibliotecas, são hoje atividades predominantemente realizadas através de sistemas
web. Os sistemas de informação implementados para acesso via internet, desenvolvidos em
Hypertext Preprocessor (PHP) com base de dados em MYSQL, sem preocupação com a
segurança das transferências das informações, ficam vulneráveis a diversos tipos de ataques
maliciosos. A maioria desses ataques é efetuada através da linguagem de acesso a dados
Structured Query Language (SQL), denominados de SQL Injections . Este tipo de ataque é
resultado da necessidade da construção dinâmica de consultas dentro da linguagem de
programação para consultar os dados destes sistemas, somada a práticas inseguras no
desenvolvimento de um banco de dados.
Caderno de Estudos Tecnológicos
1.1 O sistema gerenciador de banco de dados MYSQL
Hoje em dia existem diversos tipos de banco de dados utilizados com diferentes tipos de
linguagem de programação em diferentes tipos de servidores e computadores, porém é possível
perceber através de pesquisas e estudos, que o sistema gerenciador de banco de dados (SGBD)
MYSQL é o mais utilizado no desenvolvimento de aplicações web, por apresentar
características que facilitam o desenvolvimento dos sistemas e administração dos dados.
[Infoescola 2013]
O fato de não precisar, muitas vezes, de um servidor ou máquinas potentes para sua
utilização também faz com que o MYSQL seja um dos SGBD mais utilizados no mundo.
Conforme Souza (2008) e Pires (2009), o MYSQL funciona muito bem em aplicações web,
além de possuir desempenho em média 30% superior do que seus concorrentes como Firebird e
PostgreeSQL entre outros. É multiplataforma, ou seja, pode ser instalado em vários sistemas
operacionais diferentes.
Pelo fato de ser o SGBD mais utilizado em aplicações web, acaba sendo um dos mais
visados a ataques de usuários maliciosos.
1.2 A linguagem SQL
SQL é a linguagem padrão para manipulação de dados em uma base de dados relacionais,
possui algumas palavras chaves para consultar, atualizar, inserir e remover dados de uma base
de dados relacional. Segundo SQL Tutorial (2013) são elas: a) SELECT: para consultar
(selecionar) informações de um banco de dados; b) INSERT: para inserir informações em um
banco de dados; c) UPDATE: para atualizar informações em um banco de dados; d) DELETE:
para remover informações em um banco de dados.
Os ataques por SQL Injection se utilizam das construções desses comandos SQL para
adicionar adendos aos mesmos para, dessa forma, realizarem operações indevidas nos sistemas.
Principalmente através das cláusulas UNION ALL, ORDER BY, e a função @@version.
1.3 A linguagem PHP
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Página
Além de ser uma linguagem de programação gratuita é multiplataforma, ou seja, capaz
de ser executada em vários sistemas operacionais, diferente da maioria de suas concorrentes,
dessa forma se uma empresa necessitasse mudar o sistema operacional que trabalha, não
necessitaria de uma migração de linguagem também, apenas passar seus scripts PHP de uma
maquina para a outra. A linguagem PHP possui elementos de outras linguagens, como Perl,
Java e C, linguagens estas que costumam ser conhecidas pelos programadores web, o que
facilita a curva de aprendizado.
49
Segundo o PHP Manual (2013), PHP é uma linguagem de programação de uso livre, estando
sob a licença Open Source License certificada pela Open Source Initiative e possui uma curva
de desenvolvimento muito rápida. É utilizada por mais de 20 milhões de domínios da internet, e
está presente em mais de 50% das instalações do servidor web Apache. Entre os domínios
citados se encontram: o sistema de aprendizado Moodle, a rede social Facebook e o agregador
de notícias Digg.
Caderno de Estudos Tecnológicos
O PHP Manual (2013) informa que a linguagem possui instruções nativas para interação
com o banco de dados MYSQL em maior quantidade que as disponíveis para outros sistemas
gerenciadores de banco de dados (SGBD). Como alguns exemplos:
Mysql_connect() – Abre uma conexão com um servidor MYSQL
Mysql_fetch_array() – Obtém uma linha do resultado como uma matriz associativa
Mysql_db_query() – Envia uma consulta MYSQL
Essa facilidade de interação entre a linguagem de programação PHP e o SGBD
MYSQL e de ambos com o servidor web Apache tem feito esse ser o ambiente mais utilizado
em sistemas web e ao mesmo tempo, visado quanto aos ataques de SQL Injection.
1.4 A vulnerabilidade em sistemas web
Conforme Farias (2009), aplicações web são construídas a partir de diversas tecnologias,
tipicamente com um servidor de banco de dados, um servidor web e uma ou mais linguagens de
programação, todos os quais podem ser executados em um ou mais sistemas operacionais, ao
mesmo tempo ou não. Existem cada vez mais mecanismos desenvolvidos por profissionais de
segurança da informação para prevenir ataques, como politicas de acesso aos dados, correções
rápidas de falhas através de patches, algoritmos de criptografia, entre outros tantos, porém em
contrapartida, isso faz com que o foco dos atacantes seja migrado para onde não caibam
restrições e bloqueios, ou seja, as interfaces públicas dos sistemas sejam elas quaisquer formas
de entrada de dados e interação do usuário.
Por negligência em relação às boas praticas de programação relacionadas à segurança,
estes sistemas ficam vulneráveis a ataques, entre eles o SQL Injection Attack (SQLIA) ou
Ataque por Injeção de SQL que consiste na inserção de códigos ou instruções SQL dentro de
uma consulta (query) através da manipulação de entrada de dados de uma aplicação. A base de
dados e a aplicação devem ser protegidas para não sofrerem danos por conta dessas instruções
maliciosas. Para que seja possível o desenvolvimento seguro das aplicações e bancos de dados,
se faz necessário entender como estas instruções são elaboradas. Segundo Halfond (2006),
SQLIA´s acontecem, neste caso, manipulando devidamente a entrada de dados do sistema web.
Um sistema web pode ler a entrada do usuário de diversas formas distintas, tendo como base o
ambiente que o aplicativo foi implantado. Na maioria dos casos, o SQLIA vem nos envios de
formulários que são enviados para o sistema web através de HTTP GET ou POST. Os sistemas
web acessam os dados de entrada do usuário como acessam qualquer outra variável do
ambiente.
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Página
É possível, através de testes relativamente simples, identificar vulnerabilidades de sistemas
hospedados na web, onde após essa verificação é possível identificar a possibilidade de duas
formas de ataque de injeção: O Injection via formulário (preenchimento dos campos usuário e
senha com códigos maliciosos) ou Injection via URL (códigos maliciosos inseridos na URL da
página acessada).
50
2 Ataques
Caderno de Estudos Tecnológicos
Ao inserir os códigos via formulário, o invasor tem acesso à área restrita da página
como administrador (geralmente o usuário administrador é o primeiro usuário da tabela de
usuários do banco de dados do site e possui todas as permissões). Ao acessar como o sistema
como administrador, o invasor tem acesso a dados sigilosos, sendo assim, o mesmo pode se
utilizar desses dados da maneira que desejar.
Caso a invasão seja por URL o invasor utiliza códigos maliciosos na URL de acesso ao
sistema para descobrir informações contidas na base de dados, dessa maneira, conseguindo
tanto descobrir dados sigilosos de usuários como também destruir tabelas ou dados
importantes. Ao descobrir dados, como usuários e senhas de acesso, é possível acessar o
sistema como administrador e alterar, apagar ou roubar informações importantes.
3 Protótipo para experimentação
O protótipo foi desenvolvido na linguagem de programação PHP para demonstrar as
funcionalidades, vulnerabilidade e prevenções decorrentes do desenvolvimento de um sistema
web, no protótipo será observado como é possível manipular dados e retornar informações do
banco de dados MYSQL através de códigos maliciosos de injeção de SQL que serão
executados a partir de formulários e Uniform Resource Locator (URL). Na experimentação
será apresentado o funcionamento do sistema e suas vulnerabilidades, e posteriormente as
prevenções adequadas para proteção da base de dados.
3.1 Vulnerabilidades em validação de credenciamento de usuários
Uma das partes integrantes de um sistema é o controle de acesso através de identificação de
credenciais de usuários para a utilização do sistema. Este acesso é feito pela inserção de dados
em um formulário de entrada de dados, onde posteriormente será feita a conferencia dos dados
fornecidos para que aconteça a liberação do acesso ao sistema ou não. Este formulário é
basicamente composto por um campo de texto de usuário, um de senha e um botão.
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Página
A Figura 1 mostra a tela de entrada de dados, que é responsável pelo
credenciamento do usuário. Nesta tela é possível considerar como formulário o conjunto
de rótulos, caixas de texto e botões. Os rótulos são responsáveis por identificar as caixas
de textos, que por finalidade recebem os dados que serão processados posteriormente, o
botão é responsável pela ação, também chamada de evento, onde será executada a
chamada do código que será responsável por processar os dados inseridos nas caixas de
textos e validá-las como verdadeiro ou falso, liberando assim o acesso do usuário
solicitante ao sistema.
51
Figura 1: Formulário de entrada de dados para login no protótipo de experimentação.
Caderno de Estudos Tecnológicos
O código de programação a seguir demonstra o processamento dos dados para a
permissão de acesso do usuário solicitante.
Codigo: Login.php
<?php
//importação do arquivo responsavel pela conexão com o SGBD
include("conectar.php");
//Comando $_POST recebe os dados inseridos nas caixas de
textos
$login = $_POST['txtLogin'];
$senha = $_POST['txtSenha'];
//Consulta ao banco de dados para validar os dados
processados
$query = mysql_query("SELECT * FROM Usuario
'".$login."' AND usu_senha = '".$senha."';");
WHERE
usu_login
=
//verificar se o resultado da query foi encontrado
$resultQuery = mysql_fetch_array($query);
//Se for encontrado o resultado na tabela, retorna verdadeiro
e aceita a entrada do usuário.
if(mysql_num_rows($query) >= 1){
echo "<center><h1>VOCÊ ESTÁ LOGADO!</h1></center><br />";
echo"<center><h3>Usuario:<b>".$resultQuery['usu_nome']."</b><
/h3></center>";
echo "<br /><br />";
echo "<center><a href=\"listarProdutos.php\">
Clique para entrar na página de produtos</a></center>";
//se falso, aparece mensagem de erro e a entrada não é
permitida.
}else{
echo "ERRO AO TENTAR LOGAR";
}
?>
Usuario
WHERE
Faculdade de Tecnologia de Bauru
usu_login
=
'".$login."'
AND
usu_senha=
Página
SELECT * FROM
'".$senha."';
52
O momento de validação dos dados que estão em processamento no código referese a consulta SQL que está embutida no código:
volume 01 – número 01 – julho/2013
Caderno de Estudos Tecnológicos
Nesta consulta ao banco de dados MYSQL, é solicitada a seleção do registro da tabela
Usuario onde o campo usu_login seja igual à variável PHP $login, que é inserida na caixa de
texto Usuario da tela representada pela Figura 1, e o campo usu_senha seja igual à variável
PHP $senha, qual também é inserida na caixa de texto Senha, também representada na Figura
1.
Se a consulta SQL retornar um valor válido referente ao registro encontrado na tabela
Usuario será permitido o acesso ao sistema, caso contrário será retornado ao usuário uma
mensagem de erro e o acesso não será autorizado.
Esta consulta SQL embutida no código de processamento dos dados evidencia uma
vulnerabilidade do sistema, pois os códigos maliciosos de injeção de SQL podem ser passados
diretamente nesta consulta, fazendo com que o próprio sistema se confunda e então permita o
acesso, essa permissão pode ser quebrada inserindo o código malicioso “ ' OR 1='1 ” nas
caixas de texto usuário e senha. Quando valida-se esses dados no sistema, a consulta SQL fica
assim:
SELECT * FROM Usuario WHERE usu_login = '' OR 1='1' AND usu_senha = '' OR
1='1';
Esta consulta vai retornar um valor verdadeiro, pois em seu contexto ela busca o
registro da tabela Usuario onde o campo usu_login é igual a vazio (usu_login='') ou 1 é igual
a 1 (informação verdadeira) e o campo usu_senha é igual a vazio (usu_senha='') ou 1 é igual a
1(informação verdadeira).
usu_nome
usu_login
usu_senha
1
Administrador
admin
adm147852369
2
Rafael Barbosa
rafael
Rafa153
3
Matheus Marostiga
matheus
Ma1990
4
Fulvio Neto
fulvio
Fulvio789
É possível observar na Tabela 1 os registros retornados através da consulta com o
código de injeção de SQL embutido. Ela retornará todos os registros válidos da tabela Usuario,
validando apenas o primeiro registro e permitindo assim o acesso ao sistema.
Essa falha é considerada grave, pois deixa o acesso ao sistema totalmente vulnerável.
Um usuário mal intencionado e com o conhecimento dos códigos maliciosos poderia facilmente
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Página
usu_id
53
Tabela 1: Registros retornados através da seleção de SQL com códigos maliciosos de injeção
de SQL.
Caderno de Estudos Tecnológicos
acessar o sistema e causar danos ao sistema e a empresa ou organização que rege este sistema,
colocando em risco suas informações, dados e patrimônio.
3.2 Agrupamento de comandos SQL via url
As diversas formas de invasão estão relacionadas principalmente aos formulários de consulta de
dados ou credenciamentos, considerando que possa ter veracidade neste pensamento, é deixado
de lado outro fator muito importante para a proteção dos dados e informações, que estão
contidas em nossa base de dados relacionada com a aplicação web, são os agrupamentos de
comandos SQL via url.
A injeção de SQL via url, chamada assim entre os pesquisadores e profissionais da área
de tecnologia da informação, é uma prática comum e perigosa. Muitos desenvolvedores
esquecem algumas normas de segurança e deixam informações das consultas à base de dados
explícitas em suas passagens de parâmetros de uma página para outra por exemplo, ou mesmo
quando suas funcionalidades precisam de algum retorno para parametrizar alguma consulta ou
processamento.
Existem dois métodos para transferência de dados entre os códigos de um sistema web,
o GET e o POST. Sabe-se que o GET, apesar de possuir uma vulnerabilidade de segurança é
considerado o método padrão por muitas plataformas. [Gilmore 2010]
Em uma aplicação web utilizando PHP, os dados transferidos por GET são passados
por parâmetros via url com a seguinte representação:
http://www.[dominio].com.br/[nome_da_pagina].php?[nome_da_variável]=[valor]
O trecho de código após o caractere “?” exibe uma variável com seu valor, isso
significa que o valor que foi consultado na base de dados está explicito na URL, então a partir
desse ponto vulnerável, podemos retornar informações e dados da base de dados com o
agrupamento de comandos SQL.
Considerando a seguinte URL, que se refere a uma página que é responsável por exibir
os detalhes de um produto:
http://www.siteteste.com.br/detalhes.php?prod_id = 1
Este sistema web provavelmente terá um código PHP que receberá um valor em uma
variável, como o seguinte:
$id = $_GET[‘id’];
Esse valor será passado para outra variável, nesta estará contido o código que será
responsável pela consulta SQL, como:
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Página
A variável $query recebe o retorno do evento PHP mysql_query(), o qual é responsável
por executar a consulta no MYSQL. A consulta sugere que sejam selecionados todos os
registros na tabela produto onde os produtos com prod_id sejam iguais ao valor da variável
$id. Essa consulta está sendo executada de forma explícita no código, expondo a
vulnerabilidade do sistema e o risco da base de dados, sendo assim a porta para códigos de
injeção de SQL. Com um simples teste, é feita a verificação da aceitação desses códigos.
54
$query = mysql_query(“SELECT * FROM produto WHERE prod_id = ‘$id’”);
Caderno de Estudos Tecnológicos
http://www.siteteste.com.br/detalhes.php?prod_id = 1’
Se forem inseridas ‘(aspas simples) no final da url e a página retornar um erro dizendo:
“You have an error on your SQL syntax; check the manual that corresponds to your MYSQL
server version for the…”, significa que este sistema web está vulnerável, sendo assim, segue
uma série de verificações para retornar informações sobre a base de dados.
3.3 Comandos de injeção de SQL e retornos
Não existem comandos especiais que caracterizam a injeção de SQL, esse ataque é feito
utilizando comandos SQL de acordo com as informações que deseja retornar na consulta,
quebrando, dessa forma, bloqueios que supostamente impediriam o roubo de dados, uso
indevido do sistema e até mesmo danos à base de dados.
3.3.1 Verificando a quantidade de colunas de uma tabela
Considerando a url discutida em tópicos anteriores, será agrupado um comando para
verificação da quantidade de colunas existentes na tabela. Para isso será utilizado a cláusula
SQL chamada ORDER BY.
Quando é necessário classificar os resultados retornados em uma consulta SQL, a
cláusula ORDER BY é utilizada, assim é possível especificar qualquer número de colunas.
[Hotek 2010]
http://www.siteteste.com.br/detalhes.php?prod_id = 1’ORDER BY 1,2,3,4(...).
Deve-se agrupar as colunas na cláusula ORDER BY testando de 1 até n , sendo que,
quando em n ocorrer um erro, tem-se a informação que n-1 se refere ao numero de colunas da
tabela consultada, no caso se no número 5 acontecer o erro, 4 será o valor correspondente ao
número de colunas que podem ser usadas para os demais comandos.
3.3.2 Visualizando os dados com a função UNION
Este é um ponto considerável, pois a partir da função UNION os ataques são eficazes o
suficiente para retornar dados, conforme o protótipo, é possível então retornar o conjunto de
informações da base de dados com o seguinte código:
http://www.siteteste.com.br/detalhes.php?prod_id =1 UNION ALL SELECT 1,2,3,4
http://www.siteteste.com.br/detalhes.php?prod_id =1 UNION ALL SELECT 1, 2, 3,
@@version
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Página
Conforme acontece com as linguagens de programação e softwares, com o lançamento de
novas versões, existem as melhorias e também algumas mudanças de sintaxe, instâncias, etc.
Com isso o comando @@version é capaz de informar a versão do sistema gerenciador de
banco de dados (SGBD), para assim usar a sintaxe correta para a versão em uso no sistema
web.
55
3.3.3 Descobrindo a versão do SGBD MySQL
Caderno de Estudos Tecnológicos
3.3.4 Obtendo o nome dos schemas, tabelas e colunas
http://www.siteteste.com.br/detalhes.php?prod_id
column_name from information_schema.columns—
=1 UNION ALL SELECT 1, 2, 3,
O comando acima tem como finalidade retornar o nome das colunas e tabelas do schema
principal do banco. Uma vez que os privilégios de usuários não são configurados corretamente,
o invasor conseguirá retornar os nomes de tabelas e colunas e assim fazer a seleção dos dados
que precisará para prosseguir com o SQL Injection.
Para que finalmente sejam retornados os dados necessários para acesso ao sistema web
e também alterações na base de dados, o invasor fará uma nova sequencia de comandos, onde
poderá então obter nomes de usuários, senhas e informações de outras tabelas que compõem o
schema que está sendo atacado. Para retornar dados da tabela usuário, como exemplo,
utilizam-se os próximos códigos, e com sucesso, o invasor conseguirá manipular o sistema web
e a base de dados, com livre acesso e más intenções.
http://www.siteteste.com.br/detalhes.php?prod_id =1 UNION ALL SELECT 1, 2, 3,
column_name from information_schema.column WHERE table_name=’usuario’—
http://www.siteteste.com.br/detalhes.php?prod_id
concat(username,0x3a,password)from admin/*
=1 UNION ALL SELECT 1, 2, 3,
http://www.siteteste.com.br/detalhes.php?prod_id=1/**/union/**/all/**/select/**/0x
31,concat_ws(0x3a,username,password),0x33/**/from/**/users--
4 Desenvolvimento seguro
No item 3 foi apresentada uma análise das possíveis vulnerabilidades de injeções, mostrando
possíveis danos que podem ser gerados por essas falhas. A partir do conhecimento adquirido
com a experimentação e os estudos sobre injeção de SQL, serão apresentadas formas de
prevenção de injeção de SQL.
DELIMITER $$
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Página
Como a porta de entrada para a injeção de SQL são os blocos de código SQL gerados
dinamicamente e que possuem a instrução SELECT, é possível utilizar o objeto chamado
Procedimentos Armazenados (STORED PROCEDURES) a partir da versão 5.0 do MYSQL,
para montar um bloco de código onde serão definidas as variáveis de entrada, o processamento
da consulta e o retorno de dados e informações da base de dados. O que torna esse objeto
seguro é que ele permite fazer o tratamento dos dados de entrada no processamento da
consulta. Para isso foi criada a STORED PROCEDURE da seguinte forma:
56
Definida a modelagem do banco de dados, é possível começar a criação da base de
dados e seus objetos, e nessa etapa do desenvolvimento são aplicadas algumas medidas de
segurança. Nesse primeiro momento são efetuadas as configurações da base de dados, como
relacionar a base a um ou mais usuários do SGBD, e a política de permissões para esses
usuários. Com essas políticas, configuradas com os comandos GRANT, utilizado para conceder
privilégios, e REVOKE, utilizado para revogar privilégios, por exemplo, é possível garantir
quais usuários terão acesso a executar qualquer comando além do SELECT.
Caderno de Estudos Tecnológicos
USE `tcc_fechado`$$
DROP PROCEDURE IF EXISTS `TCC_Usuario_SELECT`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `TCC_Usuario_SELECT`(IN
v_login VARCHAR(60),
v_senha VARCHAR(60)
)
BEGIN
SELECT
usu_login,
usu_senha,
usu_nome
FROM usuario
WHERE
(usu_login = REPLACE(v_login,'\'',''))
AND (usu_senha = REPLACE(v_senha,'\'',''));
END$$
DELIMITER ;
É possível observar que existe uma consulta simples dentro de um objeto de banco de
dados, onde na cláusula WHERE foi utilizada uma função chamada REPLACE.
REPLACE([variável], ‘[caractere]’,’[caractere substituto]’)
O comando REPLACE utilizado na STORED PROCEDURE substitui aspas simples por
um caractere em branco, nesse caso, a tentativa de concatenar um código malicioso na consulta
será frustrada, pois todas as aspas simples necessárias para a consulta serão substituídas e,
assim, o retorno será uma mensagem de erro.
Quando é utilizada a política de segurança de inserir todas as consultas em STORED
PROCEDURES, a execução é limitada ao objeto do banco de dados, ou seja, não existe
consulta direta a base de dados por parte do sistema web.
No código abaixo as informações desejadas são buscadas utilizando uma consulta
direta, não há nenhum objeto entre a consulta e a base de dados, onde é possível enxergar os
pontos de vulnerabilidade.
CALL TCC_Usuario_SELECT('".$login."','".$senha."')
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Página
Quando se utiliza um objeto para a consulta, neste caso uma STORED PROCEDURE,
é criado um filtro entre a consulta e a base de dados. Como observado, na estrutura da
STORED PROCEDURE, existe a consulta, porém a codificação dela não é explícita no código
do sistema web e, sim, uma chamada ao objeto passando para ele valores das variáveis de
entrada:
57
SELECT * FROM Usuario WHERE usu_login = '".$login."' AND usu_senha = '".$senha."';
Caderno de Estudos Tecnológicos
Utilizando este artifício, tanto os ataques via formulários de credenciamentos como
também via URL são prevenidos, protegendo assim a base de dados e as informações.
5 Conclusão
Não é necessário exercitar uma política radical e extremamente complexa de segurança no
desenvolvimento do banco de dados e seu acesso pelo sistema web. Simples ações, como a
criação de uma STORED PROCEDURE com tratamento dos dados de entrada, políticas
básicas de acesso dos usuários aos dados, entre outros itens simples, podem blindar uma
aplicação e uma base de dados, garantindo assim a segurança das informações e dos dados.
6 Referências
Beighley, L. Use a Cabeça: SQL. Rio de Janeiro: Alta Books, 2010.
Canto, F. C. (2001) “Vulnerabilidades da Linguagem PHP”. Universidade Federal do Rio
Grande do Sul, Porto Alegre.
Farias, M. B.(2009) “Injeção de SQL em aplicações Web: causas e prevenção” Graduação em
Ciência da Computação – Universidade Federal do Rio Grande do Sul, Porto Alegre.
Gilmore,W. J. (2010) “Dominando PHP e MYSQL: Do Iniciante ao Profissional”. Rio de
Janeiro: Alta Books.
Halfond, W. G. F., Viegas, J. e Orso, A. (2006) “A Classification of SQL Injection Attacks and
Countermeasures”. – College of Computing – Georgia Institute of Technology, Atlanta.
Hotek, M. (2010) “Microsoft SQL Server 2008 – Passo a Passo. Bookman.
Infoescola - MySQL – Acesso em 2013. http://www.infoescola.com/informatica/mysql/.
PHP Manual – Acesso em 2013. http://www.php.net/manual/pt_BR/index.php
Pires, C. E. S., Nascimento, R. O., Salgado, A. C. (2009) “Comparativo de Desempenho entre
Bancos de Dados de Código Aberto”. – Centro de Informática – Universidade Federal de
Pernambuco (UFPE), Recife.
SQL Tutorial – Acesso em 2013. http://www.w3schools.com/sql/default.asp.
Página
58
Souza, M. O., Matioski, M. E. e Neves, L. A. P. (2008) Análise de desempenho dos bancos de
dados MYSQL, PostgreSQL e Firebird: Um Estudo de Caso. Em Revista Cientifica de
Administração, páginas 7 – 22. Editora Gráfica Expoente.
Faculdade de Tecnologia de Bauru
volume 01 – número 01 – julho/2013
Download