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.
1 comentários:
[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
Postar um comentário