¿Como puedo evitar la inyeccion de SQL?

Quisiera poder evitar este tipo de ataque en mi aplicacion web pero no tengo mucha idea de por donde empezar...

Más ▼

Preguntada jul 06 a las 11:42

b3lia1\'s gravatar image

b3lia1
46 1 3 4

Explícame esto b3lia1 ¿Tú mismo te haces la pregunta y de das la respuesta? Algo huele a podrido en...

jul 22 a las 08:38 alt505

Los primeros usuarios del Site han sido los propios técnicos de InfoJobs, quienes han dado un primer empujoncito en la generación de contenido para que el día de su lanzamiento no estuviera vacío.

Algunos de los técnicos con dudas reales de su día a día seguían buscando por internet después de publicarme la pregunta y encontraban la solución. Pensé que formaba parte del espíritu del site que si alguien sabía la solución a un problema, la publicara. Así servirá para otros.

Confío que el propio sistema de votaciones hará que las buenas respuestas sobresalgan sobre las malas.

jul 26 a las 12:03 David_Monreal ♦♦
(comments are locked)
10|600 characters needed Caracteres pendientes
 moderation talk

8 respuestas:

Existe una clase para ello: PHPInputFilter. Es gratuita y, como asegura su descripción, te filtra javascript, html y php no deseado.

También puedes encontrar clases de filtrado en PEAR

Más ▼

Respondido ago 05 a las 07:07

manel.jove\'s gravatar image

manel.jove
46

(comments are locked)
10|600 characters needed Caracteres pendientes
 moderation talk

Antes de plantearse usar soluciones con "nombre propio" en entornos concretos creo que es mejor intentar analizar el problema y delimitarlo para poder comprenderlo aplicado a otras situaciones y entornos de desarrollo distintos al planteado.

Si estás interesado en la forma de evitar la inyección de código SQL deduzco que programas y que además tus programas contienen queries que atacan a una BBDD. Este es un caso de lo más común en programación web y cliente/ servidor en general.

Cuando componemos queries con el input del usuario debemos tener en cuenta que tenemos una "ventana abierta" al exterior ya que los datos recibidos se integran en variables que contienen código SQL que posteriormente ejecutamos en el contexto de la BBDD. Habrá usuarios que introducirán sólo valores deseados, pero otros malintencionados intentarán usar esta ventana para obtener acceso a nuestros datos introduciendo sentencias SQL que pueden llegar a ejecutarse y así borrar datos, modificarlos o simplemente extraerlos.

La solución es sencilla, basta con filtrar cualquier palabra clave SQL al recepcionar los valores de input del usuario provenientes de un formulario y limitar su longitud para evitar la inyección de código, o dicho de otra manera, asegurarnos de que lo que introducimos en nuestro servidor de BBDD está limpio de sorpresas. Lo mejor es programar una función que haga esta tarea para poder reutilizarla todas las veces que queramos. Te incluyo código mio en VBScript.

function filtroSQL(SQLPart, l)

    SQLPart=trim(cstr(SQLPart))
    'Comprobamos que no hay caracteres no permitidos
    allowedChar="abcdefghijklmnopqrstuvwxyz0123456789@-.,_/ "
       for i=0 to len(SQLPart)-1
         isOK=false
         for j=0 to len(allowedChar)-1
          if mid(allowedChar, j+1, 1) = lcase(mid(SQLPart, i+1, 1)) then
              isOK=true
          end if
         next
          if isOK=false then
              'Response.Write lcase(mid(SQLPart, i+1, 1)) & "<br>"
              SQLPart=replace(SQLPart,lcase(mid(SQLPart, i+1, 1)),"*")
          end if
       next  

    'Comprobamos que no hay palabras reservadas de SQL        
       SQLPart=replace(ucase(SQLPart)," * ","")
       SQLPart=replace(ucase(SQLPart)," HAVING ","")
       SQLPart=replace(ucase(SQLPart)," SELECT ","")
       SQLPart=replace(ucase(SQLPart)," DELETE ","")
       SQLPart=replace(ucase(SQLPart)," INSERT ","")
       SQLPart=replace(ucase(SQLPart)," UPDATE ","")
       SQLPart=replace(ucase(SQLPart)," AND ","")
       SQLPart=replace(ucase(SQLPart)," IN ","")
       SQLPart=replace(ucase(SQLPart)," VALUES ","")
       SQLPart=replace(ucase(SQLPart)," OR ","")

    'Cambiamos las comas por puntos en los numeros
       if isNumeric(SQLPart) then
         SQLPart=replace(SQLPart,",",".")
       end if

         SQLPart=left(SQLPart,l)

         filtroSQL=SQLPart

end function
Más ▼

Respondido ago 09 a las 19:20

daniel.j.garcia.fidalgo\'s gravatar image

Daniel J. García Fidalgo
16

(comments are locked)
10|600 characters needed Caracteres pendientes
 moderation talk

SI utilizas una capa de persistencia utilizando mapeo de objetos, como por ejemplo hibernate, ya tienes solucionado el problema.

Te recomiendo que busques por internet el proyecto "webgoat", que es un proyecto web diseñado con agujeros de seguridad a propósito, con ta de que sirva como referencia para aprender técnicas de seguridad.

Y como bien han comentado, es muy raro que hagas la pregunta y que tu mismo te contestes después dando la respuesta y simulando ser otra persona (es un sistema cutre para ganar puntos).

Más ▼

Respondido jul 23 a las 08:10

drteba\'s gravatar image

drteba
61

(comments are locked)
10|600 characters needed Caracteres pendientes
 moderation talk

Las inyecciones de SQL suelen suceder cuando no se filtra correctamente los datos que ha introducido un usuario.

Una forma bastante simple es filtrar el tipo de datos permitidos. Por ejemplo si el usuario introduce una fecha, procurar que tenga una estructura determinada y no contenga caracteres extraños como ",',-,#,etc...

Puedes encontrar una explicacion bastante larga y con ejemplos (en ingles :S) aqui

SQL Injection Prevention Cheat Sheet

Más ▼

Respondido jul 06 a las 11:42

b3lia1\'s gravatar image

b3lia1
46 1 3 4

(comments are locked)
10|600 characters needed Caracteres pendientes
 moderation talk

yo he encontrado en los complementos de firefox un testeador de sql injection, creo que se llama injection me!.

Más ▼

Respondido nov 21 a las 18:44

deleted_user\'s gravatar image

Anónimo
127 15 32 48

(comments are locked)
10|600 characters needed Caracteres pendientes
 moderation talk
Your answer
Cambiar visualización:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Seguir esta pregunta

Por Email:

Once you sign in you will be able to subscribe for any updates here

Por RSS:

Respuestas

Respuestas y comentarios

Empleo

Ofertas de Informática, telecomunicaciones...

Temas:

x4
x4
x2
x2
x1

Preguntada: jul 06 a las 11:42

Vista: 918 times

Actualizado por última vez: jul 06 a las 11:42