Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

onedev

Proteções contra Injeção SQL

Recommended Posts

Pessoal,

 

quais são as melhores dicas para proteger um sistema web contra Injeção SQL? No campo de login estou tratando as aspas simples da seguinte forma:

 

login = Trim(Request.Form("login"))
 login = Replace(login, "'", "")
 login = Replace(login, "|", "")
 senha = Trim(Request.Form("senha"))
 senha = Replace(senha, "'", "")
 senha = Replace(senha, "|", "")
Só isso resolve? O ideal seria construi uma função com uma rotina para dar uma replace em caracteres invalidos. Acho que essa ideia seria boa.

 

Segue uma função que um amigo me passou, mas segundo ele essa função funciona bem para evitar os ataques mas o problema é que em sistemas com grandes acessos ela poderá travar pois ela faz um loop nas requisições, segue:

 

<%
Function BlockInjection(entrada)
 Dim i
 Dim palavra
 Dim arrayReservado : arrayReservado = Array(_
 "UPDATE", _
 "SELECT", _
 "INSERT", _
 "DELETE", _
 "DROP", _
 "XTYPE", _
 "EXEC", _
 "VARCHAR", _
 "DECLARE", _
 "'", _
 "EXECUTE", _
 "XP_", _
 "FROM", _
 "NULL", _
 "SET", _
 "CAST", _
 "CONVERT", _
 "DATABASE", _
 "TABLE", _
 "WHERE", _
 "--", _
		"-", _
		";", _
		"--", _
		"|", _
		"""", _
		"(", _
		")", _
		"%" _
 )
 For i = 0 To uBound(arrayReservado)
 palavra = 1
 While palavra <> 0
 palavra = inStr(1, entrada, arrayReservado(i), vbTextCompare)
 If palavra <> 0 Then
 entrada = Left(entrada, palavra - 1) & "" & Asc(Mid(entrada, palavra, 1)) & ";" & Right(entrada, Len(entrada) - palavra)
 End If
 Wend
 Next
 blockInjection = entrada
End Function
%>

Ai você precisa passar assim: SELECT * FROM tabela WHERE id = &BlockInjection(Request("id"))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra função que me mostraram aqui é uma que está presente na loja da locaweb e dizem funcionar muito bem. Essa função deve ser chamada em todas as páginas:

 

<%
Sub Valida_Request()
 
   Set objRegExpr = New RegExp
   objRegExpr.Global = True
   objRegExpr.IgnoreCase = True
   objRegExpr.Pattern = "([\s]*(insert|update|upload|delete|drop|select|create|information_schema)[\s])|(""|'|;)"
 
   For Each obj In Request.Form
     If objRegExpr.Test(Request.Form(obj)) Then
       Response.Write "<div align=center><font color=#FF0000 size=2 face=Arial>A palavra ou carctere <strong>"& Request.Form(obj) &"</strong> é invalido para o Campo " & obj & " favor substituí-lo ou retirá-lo.<br> <a href='javascript:history.back();'>CLIQUE AQUI PARA VOLTAR</a></font></div>"
       Response.End
     End If
   Next
 
   For Each obj In Request.QueryString
     If objRegExpr.Test(Request.QueryString(obj)) Then
       Response.Write "<div align=center><font color=#FF0000 size=2 face=Arial>A palavra ou carctere <strong>"& Request.Form(obj) &"</strong> é invalido para o Campo " & obj & " favor substituí-lo ou retirá-lo.<br> <a href='javascript:history.back();'>CLIQUE AQUI PARA VOLTAR</a></font></div>"
       Response.End
     End If
   Next
 
   Set objRegExpr = Nothing
 
End Sub
%>

Em todas as páginas que você precisar da proteção coloque <%Call Valida_Request()%>

E ai, qual a melhor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sempre uso esta função, pode te ajudar

 

'*********************************************************************************
'******** Filtro SQL Injection ***************************************************
'*********************************************************************************

Function SafeSQL(sInput)
  TempString = sInput
  'sBadChars=array("select", "drop", ";", "--", "insert", "delete", "xp_", "#", "%", "&", "'", "(", ")", "/", "\", ":", ";", "<", ">", "=", "[", "]", "?", "`", "|") 
  sBadChars=array("select", "drop", ";", "--", "insert", "delete", "xp_", "#", "%", "&", "'", "(", ")", ":", ";", "<", ">", "=", "[", "]", "?", "`", "|") 
  For iCounter = 0 to uBound(sBadChars)
    TempString = replace(TempString,sBadChars(iCounter),"")
  Next
  SafeSQL = TempString
End function

Compartilhar este post


Link para o post
Compartilhar em outros sites

heheheheh o famoso injection

 

DELETE, DROP, EXEC, DECLARE, EXECUTE, SET, CAST, CONVERT

 

1º replace em EXEC e EXECUTE é redundante

 

2º imagine uma frase

"deletei meu set musical assim que executei" resultado "meu musical assim que"

 

 

"declare seu drops antes de converter seu premio" resultado "seu antes de seu premio"

 

 

 

 

enfim, são frases aleatorias com palavras de uso comum que NÃO podem ser excluidas de frase

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basicão de proteção contra SQLInjection é Validar todos os dados que são passados por FORM, link ou qualquer tipo de entrada "externa" à sua SQL.

 

Campos que recebem texto: deve ser tratada a presença da ' (plica, ou aspa simples), uma simples substituição por duas delas já protege nesse tipo de campo.

Campo que recebem numeros: deve ser tratada a peresença de caracteres não numerais na expressão, um Eval e uso de funções nativas (isNumber, IsDate, etc.) evitam ao máximo.

 

Se a exclusão/privação de palavras reservadas fosse a única alternativa não existiriam fóruns sobre programação na web.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.