From: | Gunnar Wolf <gwolf(at)gwolf(dot)org> |
---|---|
To: | Henry <hensa22(at)yahoo(dot)es> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Simbolos dentro de cadenas |
Date: | 2007-03-16 01:17:04 |
Message-ID: | 20070316011704.GB20807@gwolf.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Henry dijo [Fri, Mar 16, 2007 at 01:27:23AM +0100]:
> lo que quiero decir es que cuando usas una funcion en postgres para alguna operacion,
> se pone implemente
>
> select * from tabla where campo=parametro_1;
>
> en cambio cuando usas algo asi en alguna app,
> la mayoria de lenguaje lo usan asi:
>
> sql="select * from tabla='" + parametro_1 + "'"; (creo que power builder no)
>
> y ya sabemos que puede pasar, si un usuario pone un valor mal
> intencionado en parametro_1, al menos que primero asegures que
> parametro_1 es un valor adecuado para la consulta, osea tendria que
> crear alguna subrutina para esto, la mayoria de aplicaciones ya
> vienen con subrutinas para esto, algo como 'prepare' o algo asi.
¡Ahí está! ¡Le pegaste al problema! (supongo que te faltó un "where
id" después de espcificar tabla) Si construyes tus consultas SQL
concatenando (o interpolando) cadenas y variables suministradas por el
usuario, nunca vas a tener seguridad alguna. Puedes, del mismo modo,
llamar a tu función:
sql = "select dame_resultados(" + parametro_1 + ")";
parametro_1 sigue viajando como parte de la cadena. Y por más que
protejas a tu función, ¿qué pasa si parametro_1 contiene:
1); delete from tabla; --
Pese al blindaje que intentaste poner a través de la función
dame_resultados, el usuario te está inyectando un delete from tabla
como si nada. Sin embargo, si tienes (evitando notaciones específicas
a lenguajes, inventando sintaxis):
statement = pg_prepare("select * from tabla where id = ?")
statement.execute(parametro_1)
te puedes olvidar de inyecciones de SQL - El '?' se vuelve un
"placeholder" - un elemento que será reemplazado en la consulta (ya
compilada y procesada por el motor de Postgres) por la consulta que
vayas a hacer.
> es por eso que tambien evito en lo posible usar la sentencia
> 'execute' de postgres, al menos que sea yo mismo quien ponga los
> valores para armar la consulta.
Claro, si -contrario a lo que asumí arriba- estás armando la consulta
basándote en los datos que te da el usuario para el _nombre de la
tabla_, entonces sí tienes un problema severo. Sugiero validar
parametro_1 contra la lista de tablas válidas - y no meter datos
proporcionados por el usuario indiscriminadamente, sólo los datos
generados por tu programa. Por más dinámica que sea la consulta.
> bueno, para serte sincero hasta un insert into simple, lo pongo en
> funciones,
> y bueno no creo que traiga rigides muy alta hacerlo.
Bueno... me quedo mis opiniones, creo que ya llegamos a un punto
muerto ;-)
> ah, una pregunta, una vista tambien no se tomaria como pre-fabricada?
Sí. Hay ocasiones en que las vistas son la respuesta adecuada... Pero
de nuevo, depende de muchas cosas. En general, las uso mucho menos que
cuando las descubrí ;)
--
Gunnar Wolf - gwolf(at)gwolf(dot)org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
From | Date | Subject | |
---|---|---|---|
Next Message | Henry | 2007-03-16 01:51:34 | Re: Simbolos dentro de cadenas |
Previous Message | Jaime Casanova | 2007-03-16 01:08:13 | Re: Ayuda con Trigger |