terça-feira, 3 de abril de 2001

"Falha na linguagem ASP abre dados de sites"

Foi veiculado recentemente no FolhaOnline (http://www.uol.com.br/folha/informatica/ult124u5239.shl) que "uma falha na programação da linguagem ASP, utilizada no sistema de segurança de alguns sites de vendas pela internet, permite que um internauta mal-intencionado invada bancos de dados e consiga qualquer informação sobre seus clientes, inclusive o número de seus cartões de crédito."


Antes de mais nada, o ASP não é uma linguagem de programação. O Microsoft Active Server Pages é "um ambiente server-side de scripts, que pode ser usado para criar e executar aplicações para web dinâmicas". Neste ambiente diversas linguagens de script podem ser utilizadas, tais como o VBScript e JScript (não confunda com o JavaScript, que roda no browser "cliente").


Como está aumentando o número de desenvolvedores alarmados com este "problema", resolvi explicar como ele funciona e como consertar este erro que é meramente de programação - não deixando assim de ser menos perigoso. Exemplificarei com uma rotina simples de login.


Eu tenho este problema ?
Para fazer o teste, coloque em todos os seus campos de formulário o valor ' (aspa simples). Se for retornado um erro do SQL como o abaixo, você possui o problema:


Microsoft OLE DB Provider for ODBC Drivers erro '80040e14'
[Microsoft][Driver ODBC para Microsoft Access] Erro de sintaxe na expressão de consulta 'campo=''''.
/pagina.asp, line 25

Como funciona o problema ?
O problema começa com um formulário que envia informações para o servidor web:


<form action="login.asp" method="post">
 Nome: <input type="text" name="nome"><br>
 Senha: <input type="password" name="senha">
</form>


Na página login.asp, é comum existir um código semelhante a este:


<%
set conexao = Server.CreateObject( "ADODB.Connection")
'... código para abrir a conexão ...'
set recordset = conexao.execute( "select * from usuarios where usuario='" & request.form("nome") & "' and senha='" & request.form("senha") & "'" )
if recordset.eof then   'Nao encontrou ningúem
   response.redirect "index.asp"
else
   'código para setar que o usuário existe
   'geralmente é algo como:
   session("logado") = true
end if
%>


No código destacado é que mora o perigo. Note o que você está fazendo: concatenando (juntando) uma string com outra. O que aconteceria se o usuário colocasse como nome "d'angelo" ? O processamento do SQL iria apontar um erro informando que o comando SQL está mal-formado. E aqui reside a falha. Um usuário mal-intensionado poderia aproveitar essa sua "distração" e acrescentar o seu próprio código SQL, que poderia modificar registros, apagar tabelas, listar dados sensíveis, etc.


Como eu conserto ?
Nosso colaborador Mário César Mancinelli de Araújo postou uma função que resolve o problema da aspa simples no artigo "Função que resolve o problema das aspas simples nas strings de SQL" (leia também os artigos relacionados: "Código simples de login de usuários" e "Pesquisa com acentuação"). Basicamente a rotina consiste na duplicação da aspa simples, que faz com que o SQL a interprete corretamente. Não se preocupe: o SQL irá consultar apenas uma aspa no banco de dados.


O código corrigido ficaria algo como:
...
set recordset = conexao.execute( "select * from usuarios where usuario='" & plic( request.form("nome") ) & "' and senha='" & plic( request.form("senha") ) & "'" )
...


Nota: Essa função deverá ser usada em quaisquer concatenações de strings que gere código SQL (inclusão de dados, pesquisas no site, etc) e não apenas na rotina de login.


Para não gerar o false senso de segurança, o IIS e o PWS (servidores web) possuem sim falhas de segurança que podem comprometer dados, mas a Microsoft periodicamente disponibiliza no endereço http://www.microsoft.com/technet/security/current.asp os HotFixes para os furos de segurança tão rápido ela os detecte e corrija. Os administradores dos servidores (geralmente) checam este endereço regularmente e estão aptos a aplicarem os patches no servidor. Assim, só fica vulnerável quem quer.



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

1 comentários:

Thiago Mattar Jacometti disse...

[Enviado originalmente em 25/jun/2002 09:42:45]:

Uma solução que encontrei, foi usar o replace Ex.

var = replace("var"," ' "," ")
com isso ele retira a aspas simles e retorna com uma senha errada.

email: thiago@wizard.com.br