Foros del Web » Programando para Internet » PHP »

Evitar inyeccion SQL en sentencia completa

Estas en el tema de Evitar inyeccion SQL en sentencia completa en el foro de PHP en Foros del Web. Muy buenas. Tengo un "pequeño" problema con las inyecciones sql. La cuestion es que despues de leer un poco he entendido la idea de securizar ...
  #1 (permalink)  
Antiguo 17/11/2015, 01:59
 
Fecha de Ingreso: noviembre-2015
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Evitar inyeccion SQL en sentencia completa

Muy buenas.

Tengo un "pequeño" problema con las inyecciones sql. La cuestion es que despues de leer un poco he entendido la idea de securizar los parametros de entrada y he encontrado varias formas de hacerlo. Pero todas ellas, se aplican a cada parametro antes de añadirlo a la sentencia SQL.

Mi problema es que ya tengo la sentencia creada. Todas las sentencias SQL se ejecutan utilizando una funcion mia por lo que las tengo centralizadas, pero me viene la sentencia completa.

¿es posible "reformar" la sentencia SQL para que evite las inyecciones SQL?


Gracias!!!
  #2 (permalink)  
Antiguo 17/11/2015, 03:46
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 12 años, 11 meses
Puntos: 261
Respuesta: Evitar inyeccion SQL en sentencia completa

Buenas,

Mas que modificar la consulta, es prevenir que los datos que le llegan son los que esperas. Por ejemplo evitando este tipo de consultas...

Código PHP:
$consulta  "SELECT * FROM products WHERE id LIKE '%".$_GET['id']."%'";
$resultado mssql_query($consulta); 
Donde se introduce un parámetro directamente en consulta sin comprobar si el id que se espera es un número, un texto, si tiene carácteres no permitidos incompatibles con la consulta que se quiere realizar, etc...

Usar MySqli o PDO pueden ayudarte pues tienen funciones orientadas a evitar este tipo de situaciones.

Hace poco se ha hablado sobre un tema que te puede dar orientación de lo que buscas.
http://www.forosdelweb.com/f18/no-fu...n-sql-1141135/

Y aquí hay varios ejemplos que pueden orientarte sobre que no hay que hacer en las consultas para facilitar las inyecciones SQL.
http://php.net/manual/es/security.da...-injection.php
Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #3 (permalink)  
Antiguo 17/11/2015, 05:35
 
Fecha de Ingreso: noviembre-2015
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: Evitar inyeccion SQL en sentencia completa

Gracias.

Es lo que puedo apreciar. La cuestion es que ahora (tarde por supuesto) tengo que solucionar este problema y en vez de cambiar donde se crea el SQL lo queria cambiar donde se ejecuta. Ya que esto esta centralizado mientras lo otro no.


Un saludo,
  #4 (permalink)  
Antiguo 17/11/2015, 05:58
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 12 años, 11 meses
Puntos: 261
Respuesta: Evitar inyeccion SQL en sentencia completa

Hasta donde llegan mis conocimientos, todas las funciones se realizan siempre a nivel de código y antes de pasar las variables a la consulta.

Cuando dices donde se ejecuta, estamos hablando de...?

Una clase, un archivo .php con funciones, un archivo .php simple.

Con la información que facilitas, es difícil determinar el alcance del problema.

¿Puedes poner un ejemplo de como se generan las consultas y como se ejecutan?

Deduzco que la aplicación debe ser extensa, de lo contrario, no se debería tardar mucho en implementar una forma de comprobar los parámetros que llegan a las consultas.

Y de ser una aplicación grande, ya estamos hablando de analizar cual es la mejor forma de implementarlo, además de los correspondientes test o demás comprobaciones para que la aplicación siga dando los mismos resultados a pesar de los cambios.

Y yo personalmente, sea grande o pequeño el cambio, prefiero analizarlo antes y ver las distintas opciones, aunque tenga horas de trabajo, a que por hacerlo rápido se generen problemas de errores o de escalabilidad de la propia aplicación. Esto ya es una opinión personal.

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #5 (permalink)  
Antiguo 17/11/2015, 07:04
 
Fecha de Ingreso: noviembre-2015
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: Evitar inyeccion SQL en sentencia completa

Efectivamente la aplicacion es extensa, y la forma de obtener los parametros de las consultas es eterogenea.
Tengo distintas clases con varios metodos (insert, select, etc.) pero aqui no se ejecuta el mysqli_query, sino se llama a una funcion que es el encargado de ejecutar. Por eso digo que esta centralizado donde se ejecuta y puedo actuar sobre la consulta completa.

Entiendo que la forma correcta es antes de generar la consuta controlar los parametros de entrada, pero esa opcion, para mi no es muy factible a corto plazo.
Lo que tengo es la consulta sql ya completa, y queria saber si existe alguna "funcion" para controlar todos los elementes que hay en dicha consulta antes de ejecutarla.

Muchas gracias.....
  #6 (permalink)  
Antiguo 17/11/2015, 07:40
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 12 años, 11 meses
Puntos: 261
Respuesta: Evitar inyeccion SQL en sentencia completa

Ok, para aclararnos, por que se que tienes perfectamente en la cabeza el funcionamiento de tu app, pero desde aquí se ve de forma bien distinta...

Por favor, deberías poner algo del código de la parte a la que tienes acceso y quieres trabajar, así como decirnos los datos que recibes en que estado están y a partir de donde puedes trabajar, lo que llega es un array, un string, un objeto, json... es que si no es imposible hacerse una idea.

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #7 (permalink)  
Antiguo 17/11/2015, 08:39
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Evitar inyeccion SQL en sentencia completa

Cita:
Todas las sentencias SQL se ejecutan utilizando una funcion mia por lo que las tengo centralizadas
De hecho sería bueno ver exactamente cómo es el código que usas aquí.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 17/11/2015, 10:19
 
Fecha de Ingreso: noviembre-2015
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: Evitar inyeccion SQL en sentencia completa

En la funcion recibo la conexion y un String, y este String es la sentencia SQL (completa).
  #9 (permalink)  
Antiguo 17/11/2015, 10:21
 
Fecha de Ingreso: noviembre-2015
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: Evitar inyeccion SQL en sentencia completa

La forma de generar los SQL, como he comentado, es diferente en cada metodo o funcion.
Pero al final todos pasan por esta funcion ($conexion,$sql) y aqui lo unico que se hace/hacia era registrar un log.
  #10 (permalink)  
Antiguo 17/11/2015, 10:21
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Evitar inyeccion SQL en sentencia completa

Cita:
Iniciado por xabiz Ver Mensaje
En la funcion recibo la conexion y un String, y este String es la sentencia SQL (completa).
Entonces sí es complicado, la única forma de asegurar que la consulta se puede proteger es preparando todos los valores pasados.

Si no tienes acceso a ellos es imposible, porque básicamente tendrías que implementar una analizador de SQL, etc.

Básicamente lo que se hace mal desde el inicio cuesta mucho corregirlo después.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 17/11/2015, 10:34
 
Fecha de Ingreso: noviembre-2015
Mensajes: 34
Antigüedad: 8 años, 5 meses
Puntos: 4
Respuesta: Evitar inyeccion SQL en sentencia completa

Bajo mi punto de vista lo tienes difícil, lo único que se me ocurre es que uses con la sentencia sql que te llega ya preparada la función mysql_escape_string() , la cual te ahorrará algunas inyecciones sql, pero no todas, y lo último que se me ocurre es que establezcas filtros para la sentencia sql mediante expresiones regulares, así detectas si hay cosas que no debería haber

por ponerte un ejemplo con la expresión
Código Expresión regular:
Ver original
  1. "LIKE(.)%"
puedes filtrar que no aparezca ningún Like con un "%", eso sí, para evitar todo tipos de iyecciones tendrías que hacer todo tipo de expresiones regulares y conocerte que inyecciones pueden hacerte.

Ni yo se si quiera sin estas ideas son buenas, es extraño hacer ese tipo de comprobaciones cuando ya tienes la sql hecha.

Saludos! espero que te haya servido
  #12 (permalink)  
Antiguo 17/11/2015, 14:14
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 12 años, 11 meses
Puntos: 261
Respuesta: Evitar inyeccion SQL en sentencia completa

Cita:
Iniciado por xabiz Ver Mensaje
En la funcion recibo la conexion y un String, y este String es la sentencia SQL (completa).
Cita:
Iniciado por xabiz Ver Mensaje
La forma de generar los SQL, como he comentado, es diferente en cada metodo o funcion.[...]
Cita:
Iniciado por pateketrueke Ver Mensaje
[...]Si no tienes acceso a ellos es imposible, porque básicamente tendrías que implementar una analizador de SQL, etc.
Cita:
Iniciado por Knaak53 Ver Mensaje
[...]y lo último que se me ocurre es que establezcas filtros para la sentencia sql mediante expresiones regulares, así detectas si hay cosas que no debería haber[...]
En ese caso lo que se puede hacer ya lo han comentado pateketrueke y Knaak53

Tendrías que localizar todas la consultas y preparar una forma de diferenciarlas y analizarlas, así como analizar todos los datos variables, lo más cómodo (por decirlo de alguna forma) con expresiones regulares...

Pero vamos, casi trae más cuenta implementar una clase en un punto intermedio entre la consulta y los parámetros que recibe que preparar todo eso con expresiones regulares .

PD.: Entre hacerlo bien y hacerlo rápido solo hay tiempo y esas dos caras de diferencia...

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight

Etiquetas: completa, sentencia, sql
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 18:14.