30/01/2024
SQL Injection é um ataque que permite a invasores modificar operações de banco de dados através de um aplicativo. Isso pode resultar em acesso indevido e manipulação de dados, incluindo a exclusão de tabelas ou alteração de senhas de usuários.
Aqui está um exemplo de código ASP Clássico vulnerável a SQL Injection, com um parâmetro de URL:
<%
' Exemplo de código ASP Clássico vulnerável a SQL Injection
' Recebendo 'id' da URL
Dim id
id = Request.QueryString("id")
' Montagem insegura da consulta
Dim query
query = "SELECT * FROM users WHERE id = " & id
' Execução da consulta...
%>
Este código é vulnerável porque usa diretamente um dado externo ('id' da URL) na consulta SQL. Por exemplo, se o parâmetro 'id' da URL for alterado para id=0; DROP TABLE users;
, a consulta se tornará SELECT * FROM users WHERE id = 0; DROP TABLE users;
, resultando na exclusão da tabela 'users' e perda de todos os dados.
Uma das maneiras mais eficazes de proteger seu código ASP Clássico contra SQL Injection é o uso de consultas parametrizadas. As consultas parametrizadas separam os dados da instrução SQL, impedindo que os invasores insiram ou alterem comandos SQL. Agora vamos aprimorar nosso código inicial com esta técnica.
<%
' Definindo constantes para tipos de dados, direção de parâmetros e tipo de comando
Const adInteger = 3
Const adParamInput = 1
Const adCmdText = 1
' Protegendo o código com consultas parametrizadas
' Estabelecendo conexão com o banco de dados
Dim conn, cmd, param
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={SQL Server}; SERVER=localhost; DATABASE=banco; UID=usuario; PWD=senha"
' Garantindo que 'id' seja tratado como parâmetro
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM users WHERE id = ?"
cmd.CommandType = adCmdText
' Adicionando parâmetro à consulta
Set param = cmd.CreateParameter("id", adInteger, adParamInput, , Request.QueryString("id"))
cmd.Parameters.Append param
' Executando a consulta de maneira segura
Set rs = cmd.Execute
' Código para manipulação dos resultados...
' Limpando objetos
rs.Close
Set rs = Nothing
cmd.Close
Set cmd = Nothing
conn.Close
Set conn = Nothing
%>
Ao utilizar consultas parametrizadas com constantes claramente definidas, garantimos que os valores inseridos na consulta sejam tratados apenas como dados, protegendo eficazmente contra injeções SQL.
Sanitizar e validar os dados de entrada é crucial para prevenir SQL Injection em ASP Clássico. A sanitização remove elementos potencialmente perigosos dos dados, enquanto a validação verifica se eles atendem aos critérios específicos antes do processamento. Vamos ver como sanitizar valores inteiros.
<%
' Sanitizando e validando dados de entrada
Function ConverteNumero(inputData)
If IsNumeric(inputData) Then
' Se for numérico, converte para um número longo (inteiro)
ConverteNumero = CLng(inputData)
Else
' Se não for numérico, define como zero ou outro valor padrão
ConverteNumero = 0
End If
End Function
' Uso da função
Dim userId
userId = ConverteNumero(Request.QueryString("id"))
' Código para usar userId em operações seguras...
%>
A função ConverteNumero
assegura que o valor de entrada seja convertido para um número inteiro se for numérico, e definido como zero (ou outro valor padrão) caso contrário. Esta abordagem protege contra injeções SQL, assegurando que apenas dados seguros e esperados sejam utilizados nas operações do banco de dados.
É importante implementar uma validação rigorosa no lado do servidor para todos os dados de entrada, em especial parâmetros de URL e dados de formulário. Nunca confie apenas na validação do lado do cliente, como validações JavaScript.
Proteger seu código ASP Clássico contra SQL Injection é essencial para a segurança da sua aplicação. Neste artigo, abordamos diversas técnicas para evitar essa vulnerabilidade, incluindo o uso de consultas parametrizadas, sanitização e validação de dados, além de outras práticas recomendadas para a segurança de sistemas web.