Re: Seguridad en PostgreSQL

From: Gunnar Wolf <gwolf(at)gwolf(dot)org>
To: Juan Martínez <jeugenio(at)umcervantes(dot)cl>
Cc: Alejandro Gasca <agasca(at)yahoo(dot)com>, "Mario Gonzalez ( mario__ )" <gonzalemario(at)gmail(dot)com>, Jaime Casanova <systemguards(at)gmail(dot)com>, Roberto Pupo <roberto(dot)pupo(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Seguridad en PostgreSQL
Date: 2006-11-06 01:41:42
Message-ID: 20061106014142.GA2258@gwolf.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Juan Martínez dijo [Sat, Nov 04, 2006 at 06:53:31PM -0300]:
> >Tienes "magic_quotes" o algo asi activado? Prueba desactivandolo.
>
> Mmm...a ver:
>
> en php.ini
>
> magic_quotes_gpc = On
> magic_quotes_runtime = Off
> magic_quotes_sybase = Off
>
> Creo que para este caso, la linea relevante es la de
> magic_quotes_runtime, si no me equivoco...de todas maneras, estas lineas
> vienen así desde el paquete de debian.
>
> >El problema es que muchas aplicaciones simplemente asumen que eso va a
> >funcionar bien, pero resulta que algun hosting tiene que desactivar
> >magic_quotes porque otra aplicacion asume que _no_ esta activo y ahi
> >empiezan los problemas.
>
> Si...entiendo...No es mi caso.

Apuntalando un poco lo que dice Alvaro: El problema puede no
presentarse en tu entorno actual... Pero si te acostumbras a programar
utilizando practicas potencialmente peligrosas, tarde o temprano
caeras en un agujero. Mejor acostumbrate a hacer las cosas bien ;-)

> Solo para cerrar el tema. Como medida de seguridad, yo invento usuarios
> en postgres que tendrán accesos determinados para ejecutar comandos
> especificos (un usuario para los SELECT, otro para los UPDATES,...)
> exclusivos para la aplicacion web (los controlo ademas por pg_hba.conf)

En mi experiencia, si bien esto ayuda bastante, agrega demasiada
complejidad al tener que acordarte de menear por todos lados varias
conexiones a la BD, y acordarte de usar la indicada cada vez. Aparte,
en el contexto de una inyeccion de SQL, te salvan de ejemplos como el
que te presente, pero si -digamos- piensas en la autenticacion de
usuarios:

"SELECT id FROM usuario WHERE login = '$login' AND password = '$passwd';"

Y recibes como password:

' OR true

pues... Te brincaste por completo la autenticacion, sin abusar de los
privilegios del usuario de solo-SELECT :)

> Cuando se trata de hacer un query que se arma a partir de algo que se le
> pregunta al usuario (en un campo INPUT type="text" por ejemplo), suelo
> tener una funcion en PHP que al recibir el dato:
>
> $texto_buscar = anti_indeseables($_REQUEST['texto_buscar']);
>
> elimina palabras claves de SQL, como precisamente "DELETE FROM ..." o
> "ALTER USER ... WITH PASSWORD ...", etc., y lo que quede se va al query...
>
> Digamos que eso me da mediana seguridad. De todas maneras es obligada la
> lectura diaria de los log de postgres (log_statement=all)...

Es un paso indeseable y molesto que tienes que hacer una y otra vez. Y
no solo en los INPUT abiertos, recuerda que un atacante puede generar
solicitudes HTML con entradas arbitrarias en _cualquier_ campo.

Mejor usa mecanismos robustos :) Los placeholders no son la panacea,
pero te ahorran muuuucho trabajo como el que estas duplicando aqui.

Saludos,

--
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

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Linder Poclaba 2006-11-06 01:44:31 Re: Procedure en postgres
Previous Message Hensa 2006-11-06 00:40:50 RE: Procedure en postgres