Re: Simbolos dentro de cadenas

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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