Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 = entradaOutra 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?
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 = TempStringheheheheh 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
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.
Tem alguns scripts de proteção contra isso no laboratorio de scripts.
Dá uma olhada lá que tem alguns interessantes.