Foros del Web » Programando para Internet » ASP Clásico »

Limitar cajas de texto para evitar injection SQL

Estas en el tema de Limitar cajas de texto para evitar injection SQL en el foro de ASP Clásico en Foros del Web. Hola tengo una página que fue atacada mediante SQL injection, quiero limitar las cajas de texto de forma que no pueda meter mas de 25 ...
  #1 (permalink)  
Antiguo 25/07/2008, 02:36
 
Fecha de Ingreso: mayo-2007
Mensajes: 239
Antigüedad: 17 años
Puntos: 0
Limitar cajas de texto para evitar injection SQL

Hola tengo una página que fue atacada mediante SQL injection, quiero limitar las cajas de texto de forma que no pueda meter mas de 25 caracteres (no hay problema) y, SOBRETODO, quiero limitar la posibilidad de introducir el simbolo " ' " y la palabra "EXEC". Donde deberia meter estas restricciones? en la plantilla HTM o en el codigo ASP?? como podria hacerlo? teneis algun enlace o tutorial?

Yo encontre este codigo en el foro: http://www.forosdelweb.com/f15/restr...on-asp-293403/ pero no se donde meterlo en mi codigo.

Espero vuestra ayuda. Gracias y un saludo!
  #2 (permalink)  
Antiguo 25/07/2008, 04:44
 
Fecha de Ingreso: octubre-2006
Mensajes: 68
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Limitar cajas de texto para evitar injection SQL

El tamaño del campo en el html
el replace() en el asp
por otro lado, te recomiendo que el usuario que tienes para la web en la base de datos, tenga los mínimos permisos necesarios, de esta manera si te has dejado algo el daño sera el menor
  #3 (permalink)  
Antiguo 25/07/2008, 06:05
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Respuesta: Limitar cajas de texto para evitar injection SQL

Hola Piskui

En cuanto a que la caja de texto no pueda contener más de 25 caracteres

Cita:
<input type="text" maxlength="25" />
Evitar inserción

Código PHP:
Dim str

Function Limpiar(strlimpiar,modolimpiar)

    
'modolimpiar = 0 Prepara strlimpiar para un login y evita sql injection    

    str = trim(strlimpiar)
    
    Select Case modolimpiar

    Case 0:
        str = lcase(str)
        str = replace(str,"  "," ")
        str = replace(str,"=","")
        str = replace(str,"'","")
        str = replace(str,"""""","")
        str = replace(str," 
or ","")
        str = replace(str," 
and ","")
        str = replace(str,"
(","")
        str = replace(str,"
)","")
        str = replace(str,"
<","")
        str = replace(str,"
>","")
        str = replace(str,"
having ","")
        str = replace(str,"
group by","")
        str = replace(str,"
union select sum","")
        str = replace(str,"
union select min","")
        str = replace(str,"
--","")
        str = replace(str,"
select ","")
        str = replace(str,"
insert ","")
        str = replace(str,"
update ","")
        str = replace(str,"
delete ","")
        str = replace(str,"
drop ","")
        str = replace(str,"
-shutdown","")

    Case Else 
        str = strlimpiar
    End Select

    Limpiar = str

End Function 
No es totalmente fiable pero .... hay solución

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #4 (permalink)  
Antiguo 25/07/2008, 07:20
 
Fecha de Ingreso: mayo-2007
Mensajes: 239
Antigüedad: 17 años
Puntos: 0
Respuesta: Limitar cajas de texto para evitar injection SQL

gracias por la respùesta, os cuento, la caja de texto si la he limitado a 25, pero el codigo ese de la funcion limpiar....como lo llamo? tengo varios textbox en distintas paginas, para login, busquedas.....como la llamaria para que busque en el texbox de cada pagina??

el problema es que el login pasa por una funcion validar_datos que valida que no esté vacio, podria integrar la funcion limpiar dentro de esta? o llamaria a la funcion limpiar y luego a la de validar?? gracias

Última edición por piskui; 25/07/2008 a las 08:16
  #5 (permalink)  
Antiguo 25/07/2008, 10:44
 
Fecha de Ingreso: mayo-2007
Mensajes: 239
Antigüedad: 17 años
Puntos: 0
Respuesta: Limitar cajas de texto para evitar injection SQL

Al final lo hice de la siguiente manera:
En mi funcion valida_datos, lo primero hice una llamada a la funcion Limpiar, pero creo que no me entra en el Case 0....os pongo el codigo:
Código PHP:
function ValidaDatos(Nombre,ValorDefecto)

Nombre=Limpiar(Nombre,"0") <-La llamada es correcta?? se llama con "0" o sin comillas o como???
if (
Request.Form(Nombre) <> ""then
ValidaDatos 
Request.Form(Nombre)
.... 
Código PHP:
Function Limpiar(strlimpiar,modolimpiar)
Dim str
    
'modolimpiar = 0 Prepara strlimpiar para un login y evita sql injection    

    str = strlimpiar
    
    Select Case modolimpiar

    Case "0":
        str = replace(str,"x","j")
        str = replace(str,"  "," ")
        str = replace(str,"=","")
        str = replace(str,"'","")
        str = replace(str,"""""","")
        str = replace(str," 
or ","")
        str = replace(str," 
and ","")
        str = replace(str,"
(","")
        str = replace(str,"
)","")
        str = replace(str,"
<","")
        str = replace(str,"
>","")
        str = replace(str,"
having ","")
        str = replace(str,"
group by","")
        str = replace(str,"
union select sum","")
        str = replace(str,"
union select min","")
        str = replace(str,"
--","")
        str = replace(str,"
select ","")
        str = replace(str,"
insert ","")
        str = replace(str,"
update ","")
        str = replace(str,"
delete ","")
        str = replace(str,"
drop ","")
        str = replace(str,"
-shutdown","")

    Case Else 
        str = strlimpiar
    End Select

    Limpiar = str

End Function 
El caso es que me logeo correctamente, pero para probar que funciona meti el primer replace ("str = replace(str,"x","j")") ya que mi usuario empieza por 'j' y lo pruebo poniendo el usuario empezando por 'x' que segun este replace.....lo cambiaria por la 'j' y deberia entrar no? pues no entra!!!!!!!!!

Se me ocurre que no este llamando bien a la funcion limpiar desde la otra funcion, el tema del "0".
Otra cosa podria ser que el problema sea por no haber definido los tipos "strlimpiar y modolimpiar"

Espero su ayuda,gracias y un saludo.

Última edición por piskui; 25/07/2008 a las 11:52
  #6 (permalink)  
Antiguo 25/07/2008, 12:01
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Respuesta: Limitar cajas de texto para evitar injection SQL

Hola

Ha sido culpa mia. Has de usarla así

Cita:
Limpiar(campo,0)
Si posteas la funcion validardato, tal vez pueda integratela en Limpiar

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #7 (permalink)  
Antiguo 25/07/2008, 12:08
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 17 años, 3 meses
Puntos: 88
Respuesta: Limitar cajas de texto para evitar injection SQL

seria mejor si utilizaran las funciones por separado, para motivos de depuracion
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #8 (permalink)  
Antiguo 25/07/2008, 18:54
 
Fecha de Ingreso: mayo-2007
Mensajes: 239
Antigüedad: 17 años
Puntos: 0
Respuesta: Limitar cajas de texto para evitar injection SQL

Cita:
Iniciado por Adler Ver Mensaje
Hola

Ha sido culpa mia. Has de usarla así



Si posteas la funcion validardato, tal vez pueda integratela en Limpiar

Suerte
Hola, llame asi a la funcion y tampoco funciona, con limpiar(nombre,0) y luego "case 0" y no hace los replace. la funcion validaDatos es esta:
Código PHP:
function ValidaDatos(Nombre,ValorDefecto'nombre es el login y valordefecto "".
Nombre=Limpiar(Nombre,0) 
  if not ActiveFile_SeUsa then
    if (Request.Form(Nombre) <> "") then
        ValidaDatos = Request.Form(Nombre)
      else
        if (Request.QueryString(Nombre) <> "") then
            ValidaDatos = Request.QueryString(Nombre)
        else
            ValidaDatos = ValorDefecto
        End if
      End if
    else ' 
se est&#225; usando el ActiveFile
      
if not ActiveFile_YaSubido then
        ValidaDatos 
ValorDefecto
      
else
      
dim iencontrado
        encontrado 
false
      
for 1 to nActiveFile_Vars
        
if ActiveFile_Vars(1,i) = Nombre then  <-esto para que sirve???
          
ValidaDatos ActiveFile_Vars(2,i)
          
encontrado true
        end 
if
      
next
      
if not encontrado then
          ValidaDatos 
ValorDefecto
      end 
if
      
end if
    
end if
End Function 

Última edición por piskui; 25/07/2008 a las 19:00
  #9 (permalink)  
Antiguo 26/07/2008, 04:22
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Respuesta: Limitar cajas de texto para evitar injection SQL

Cita:
Iniciado por Shiryu_Libra Ver Mensaje
seria mejor si utilizaran las funciones por separado, para motivos de depuracion
Si aún continuas queriendo integrar ambas funciones a pesar de lo que comenta el sensei ,prueba así

Código PHP:
function ValidaDatos(Nombre,ValorDefecto'nombre es el login y valordefecto "".  
  if not ActiveFile_SeUsa then
    if (Request.Form(Nombre) <> "") then
        ValidaDatos = Request.Form(Nombre)
      else
        if (Request.QueryString(Nombre) <> "") then
            ValidaDatos = Request.QueryString(Nombre)
        else
            ValidaDatos = ValorDefecto
        End if
      End if
    else ' 
se está usando el ActiveFile
      
if not ActiveFile_YaSubido then
        ValidaDatos 
ValorDefecto
      
else
      
dim iencontradostr
        encontrado 
false
 str 
Nombre
        str 
replace(str,"x","j")
        
str replace(str,"  "," ")
        
str replace(str,"=","")
        
str replace(str,"'","")
        
str replace(str,"""""","")
        
str replace(str," or ","")
        
str replace(str," and ","")
        
str replace(str,"(","")
        
str replace(str,")","")
        
str replace(str,"<","")
        
str replace(str,">","")
        
str replace(str,"having ","")
        
str replace(str,"group by","")
        
str replace(str,"union select sum","")
        
str replace(str,"union select min","")
        
str replace(str,"--","")
        
str replace(str,"select ","")
        
str replace(str,"insert ","")
        
str replace(str,"update ","")
        
str replace(str,"delete ","")
        
str replace(str,"drop ","")
        
str replace(str,"-shutdown",""
      for 
1 to nActiveFile_Vars
        
if ActiveFile_Vars(1,i) = str then  <-esto para que sirve???
          
ValidaDatos ActiveFile_Vars(2,i)
          
encontrado true
        end 
if
      
next
      
if not encontrado then
          ValidaDatos 
ValorDefecto
      end 
if
      
end if
    
end if
End Function 
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #10 (permalink)  
Antiguo 27/07/2008, 16:24
 
Fecha de Ingreso: mayo-2007
Mensajes: 239
Antigüedad: 17 años
Puntos: 0
Respuesta: Limitar cajas de texto para evitar injection SQL

ok muhcas gracias mañana lo pruebo en el curro y te cuento, espero que me funcione, muchas gracias compañero!!!
  #11 (permalink)  
Antiguo 28/07/2008, 01:39
 
Fecha de Ingreso: mayo-2007
Mensajes: 239
Antigüedad: 17 años
Puntos: 0
Respuesta: Limitar cajas de texto para evitar injection SQL

hola, sigo con el mismo problema.....como puedo comprobar que funciona???
Yo habia pensado que con el replace: (str,"x","j") al introducir mi login con una 'x' en lugar de una 'j' esta funcion me lo debe cambiar no? es decir si introduzco 'xuan' que lo cambie y mete 'juan'.
Tambien probé en las busquedas y si pongo a buscar algo con 'x' no lo cambia por 'j', esto es que no funciona???????????? cuando las tenia por separado me pasaba lo mismo....si alguien me puede ayudar....se lo agradeceria mucho.
  #12 (permalink)  
Antiguo 28/07/2008, 04:02
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Respuesta: Limitar cajas de texto para evitar injection SQL

Hola

¿Tampoco te fucionaba por separado?

Veamos por separado tendría que quedar algo como

Cita:
Limpiar(request("Nombre"),0)
Integrada en ValidaDatos

Cita:
ValidaDatos(request("Nombre"), aquí lo que sea el ValorDefecto)
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #13 (permalink)  
Antiguo 28/07/2008, 04:23
 
Fecha de Ingreso: mayo-2007
Mensajes: 239
Antigüedad: 17 años
Puntos: 0
Respuesta: Limitar cajas de texto para evitar injection SQL

Cita:
Iniciado por Adler Ver Mensaje
Hola

¿Tampoco te fucionaba por separado?

Veamos por separado tendría que quedar algo como


Integrada en ValidaDatos



Suerte
ahora está integrada y la llamo como "(ValidaPasoDatos("Login","")" ->valor por defecto es "".
supongo que lo que me dices de request(NOMBRE) es el login, es dcir el nick que ponemos en el formulario.
Cuando era la funcion Limpiar por separado la llamaba como "Limpiar(Login,0) y tampoco funciona, yo creo que estas llamadas son correctas no?
xq te refieres a la forma de llamar a la funcion n?
  #14 (permalink)  
Antiguo 28/07/2008, 05:01
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Respuesta: Limitar cajas de texto para evitar injection SQL

Hola

No, no llamas a las funciones correctamente. Has de hacerlo como te indique en el anterior post

Prueba así


Código PHP:
function ValidaDatos(Nombre)  
  if 
not ActiveFile_SeUsa then
    
if Nombre <> "" then
        ValidaDatos 
Nombre
        
else
            
ValidaDatos ""
        
End if
    else 
' se está usando el ActiveFile
      if not ActiveFile_YaSubido then
        ValidaDatos = ""
      else
      dim i, encontrado, str
        encontrado = false

       Nombre = replace(Nombre,"x","j")
        Nombre = replace(Nombre,"  "," ")
        Nombre = replace(Nombre,"=","")
        Nombre = replace(Nombre,"'","")
        Nombre = replace(Nombre,"""""","")
        Nombre = replace(Nombre," 
or ","")
        Nombre = replace(Nombre," 
and ","")
        Nombre = replace(Nombre,"
(","")
        Nombre = replace(Nombre,"
)","")
        Nombre = replace(Nombre,"
<","")
        Nombre = replace(Nombre,"
>","")
        Nombre = replace(Nombre,"
having ","")
        Nombre = replace(Nombre,"
group by","")
        Nombre = replace(Nombre,"
union select sum","")
        Nombre = replace(Nombre,"
union select min","")
        Nombre = replace(Nombre,"
--","")
        Nombre = replace(Nombre,"
select ","")
        Nombre = replace(Nombre,"
insert ","")
        Nombre = replace(Nombre,"
update ","")
        Nombre = replace(Nombre,"
delete ","")
        Nombre = replace(Nombre,"
drop ","")
        Nombre = replace(Nombre,"
-shutdown","") 
      for i = 1 to nActiveFile_Vars
        if ActiveFile_Vars(1,i) = Nombre then  <-esto para que sirve???
          ValidaDatos = ActiveFile_Vars(2,i)
          encontrado = true
        end if
      next
      if not encontrado then
          ValidaDatos = ""
      end if
      end if
    end if
End Function 
La llamada

Código:
ValidaDatos(request("Nombre"))
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #15 (permalink)  
Antiguo 28/07/2008, 05:29
 
Fecha de Ingreso: mayo-2007
Mensajes: 239
Antigüedad: 17 años
Puntos: 0
Respuesta: Limitar cajas de texto para evitar injection SQL

asi no funciona, no entro ni con mi login correcto, no se que pasa pero me descuadra la pagina y el cuadro del login me lo muestra en el centro....yo creo que es al llamarlo con request.....xq me lo hizo otra vez probando.
Muchas gracias por tu ayuda de verdad, pero no logro dar con una solucion, y estoy pensando en dejarlo asi, y pasar de limpiar el cuadro del login.....para los cuadros de bsuqueda tengo una funcion que limita ciertas palabras SQL por lo que si se introducen las elimina, el unico cuadro que me queda es el del login que está limitado a 20 caracteres, y el usuario tiene permisos solo de consulta....yo creo que con esto seria suficiente para evitar la inserccion SQL, tu que crees???
Muchas gracias por tu ayuda de verdad, siento no saber o poder aplicarla por la complicidad del proyecto que trato, un saludo compañero!
  #16 (permalink)  
Antiguo 28/07/2008, 06:41
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Respuesta: Limitar cajas de texto para evitar injection SQL

Hola

Lamento no haberte sido de ayuda. Esperemos a ver que aportan otros

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #17 (permalink)  
Antiguo 28/07/2008, 10:50
 
Fecha de Ingreso: mayo-2007
Mensajes: 239
Antigüedad: 17 años
Puntos: 0
Respuesta: Limitar cajas de texto para evitar injection SQL

hola, me fuiste de ayuda, de verdad entendi bastante con tu ayuda, pero no logre hacerlo funcionar, aun asi muchas gracias por tu ayuda sinceramente.
Si alguno quiere comentarme alguna solucion o algo se lo agradeceria, un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:16.