Validar Dados em ASP

O que vos venho mostrar hoje é como dificultar o trabalho a pessoas que queiram explorar vulnerabilidades no vosso sistema programado em ASP. Esta semana tive um trabalho em mãos que consistia em resolver um problema num site Inglês programado em ASP pois este andava a ser atacado por hackers através de SQL Injection e através desta técnica também criavam ataques de XSS. Não precisei de muito tempo até identificar um possível buraco que pudesse ser explorado. Depois de alguns testes lá consegui obter informações sobre a base de dados desse site mas também sobre outras bases de dados existentes no mesmo servidor o que mostra não só a falta de cuidado do programador mas também do alojamento, mas como o segundo caso não me dizia respeito tratei de corrigir o primeiro.

Como Validar Dados Em ASP

Existem várias maneiras de validar dados quando estamos a desenvolver aplicações em ASP.

Função: IsNumeric()

A maior parte dos dados passados através de parâmetros nos URL são valores numéricos correspondentes a ID’s, assim a função que a linguagem ASP traz por defeito (built-in) IsNumeric() chega para verificar se os valores dos parâmetros passados correspondem a um número. Foi isto que utilizei para o caso em especifico. O programador tinha feito algo como:

GetNews = "SELECT NewsID, campox, campoy, Imagem1, Imagem2, Artigo FROM empresa_News WHERE NewsID = '"&request("id")&"' "
Set RSNews = MyConn.execute(GetNews)

E isto passava o valor do id sem qualquer tipo de validação. Passando agora a algo como

if IsNumeric(request("id")) === TRUE then
GetNews = "SELECT NewsID, campox, campoy, Imagem1, Imagem2, Artigo FROM empresa_News WHERE NewsID = '"&request("id")&"' "
Set RSNews = MyConn.execute(GetNews)

Mas podiam ter sido utilizadas outras técnicas caso não se tratasse de um valor numérico.

Escape dos Dados

function stripQuotes(str)
stripQuotes = replace(str, "'", "")
end function

Esta função vai fazer com que todos os caracteres ‘ desapareçam, pode-se adaptar esta função para outros caracteres, o que é algo que aconselho vivamente a fazerem, bem como a palavras como script, xp_, select, drop, update, where, entre outras.

Desafio

Desafio todos os leitores a criarem uma função em ASP para fazer uma validação e tratamento dos dados protegendo as páginas de SQL Injection e de ataques XSS. Para isso só precisam de deixar a vossa função nos comentários.

A melhor função será publicada num post com uma menção para o seu autor.

Show some love, divulguem e participem 🙂

6 comments

  1. viva,

    em termos globais o código que propuseste deverá ser suficiente para prevenir a maior parte dos ataques via sql injection.

    no entanto deixo dicas de optimizacao:

    em vez de:

    if IsNumeric(request("id")) === TRUE then
    GetNews = "SELECT NewsID, campox, campoy, Imagem1, Imagem2, Artigo FROM empresa_News WHERE NewsID = '"&request("id")&"' "
    Set RSNews = MyConn.execute(GetNews)

    codificar assim:

    id = request.querystring("id")
    'ou request.form conforme a origem dos dados...
    if isNumeric(id) then
    
    GetNews = "SELECT NewsID, campox, campoy, Imagem1, Imagem2, Artigo FROM empresa_News WHERE NewsID = & id
    'nao deverá ser preciso mais nada pois so entra aqui se for numerico
    
    Set RSNews = MyConn.execute(GetNews)
    end if
    
    
    fica mais simples o código assim, e ganhas bastante em termos de performance.
    1. Sem dúvida muito mais optimizado que o meu código, quanto ao tempo ganho não tenho noção de quanto será o ganho mas devemos sempre optimizar ao máximo o código pois já o povo dizia ‘grão a grão enche a galinha o papo’.

      Obrigado pela tua contribuição, espero ver-te mais vezes por cá 🙂

  2. Esta função seria mais aprofundada embora a de cima como restringe o parâmetro a um numérico será suficiente. Mas para outros inputs como strings esta é mais indicada pois remove comandos sql:

    function killChars(strWords)
    
    dim badChars
    dim newChars
    
    badChars = array("select", "drop", ";", "--", "insert",  
    "delete", "xp_")
    newChars = strWords
    
    for i = 0 to uBound(badChars)
    newChars = replace(newChars, badChars(i), "")
    next
    
    killChars = newChars
    
    end function
    1. Aprofundando a função que enviaste:

      function killChars(strWords)
      
      dim badChars
      dim newChars
      
      badChars = array(”select”, “drop”, “;”, “–”, “insert”,
      “delete”, “xp_”, "update", "where", "script")
      newChars = strWords
      
      for i = 0 to uBound(badChars)
      newChars = replace(newChars, badChars(i), “”)
      next
      
      killChars = newChars
      
      end function

      Desta forma é possível fazer mais protecções pois podia-se fazer o update de campos da base de dados ou podiam ser feitos ataques XSS pois era na mesma possível inserir scripts.

  3. Adicionei Syntax Highlighting aos vossos posts para tornar o código mais legivel.

    Francisco obrigado pela tua contribuição e tocaste num ponto que o maisAlojamento se esqueceu que foram os ataques XSS, podiamos preencher a função com mais palavras chave, mas já começa a ficar interessante.

    Tenho pena é de não poder publicar a primeira função porque é copiada de outro site (nem a segunda por ser um derivado da primeira). Vamos lá puxar pela imaginação pessoal ;).

  4. Fiz o teste e a função usada
    if isnumeric(request(“id”)) === true then

    Se voce ir no navegador na barra do endereço e acrescentar (….) junto ao numero da variavel (id) vai da problemas.

    Tera que usar alguma função que retire o ….

Leave a Reply to Francisco SilvaCancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.