PDA

Ver la versión completa : [Ayuda] MYSQL y seguridad



Danielo515
24/01/2011, 15:11
Hoola buenas a todos.

Como bien sabeis estoy algo metidillo en un proyecto web que incluye php y mysql. Llevo días, (de verdad) comiendome el tarro de cómo hacer que mi sistema de comentarios, que es anónimo, sea seguro para mi página. Y no encuentro la manera.

Para conectarme a la base de datos mysql, como todos sabeis, necesito un usuario y contraseña, a fin de poder leer de la base de datos e insertar datos.

Después discurrir, y discurrir he llegado a la conclusión de que no hay remedio para lo que planteo, ya que debo incluir todos los datos de conexión a la base de datos en un script php, el cual se encarga de todas las consultas. Y eso es lo que quiero saber si tiene algún riesgo, ya que los datos para conectar a la base de datos están ahí, en texto plano. ¿No existe el riesgo de que alguien los coja y se autentique y haga cosas malas?

He llegado a pensar que solo te puedes conectar a la base de datos de forma local, es decir, a través de una consola remota en el servidor, o con scripts que se ejecuten desde el servidor, por lo que la única manera de intentar acceder con esos datos a mi Base de datos sería subiendo un script a mi servidor via ftp, y eso si lo tengo asegurado bajo buenas contraseñas privadas. ¿ESTOY en lo cierto?

Vengo aquí desesperado porque todas las veces que busco sobre seguridad de sql me sale sobreinformación sobre la inyección, y ese tema ya lo tengo controlado.

A ver que dice la mente común

JoJo_ReloadeD
24/01/2011, 15:17
Asegurate de que tu usuario mysql solo puede acceder desde localhost y listo...

El que pongas tu usuario y contraseña en texto plano en el fichero de config de la base de datos no pasa nada... si desde un navegador accedes a un .php, este tratara de generar el html en base al codigo y mostrara justo eso...

si tu tienes un php que solo tiene $clave='miclave'; al acceder a el desde el navegador no se mostrara nada a menos que tenga luego un echo $clave;

Si te fijas, en todos los proyectos LAMP la cosa esta hecha asi.. un fichero en plan db.php y ahi el usuario y contraseña para acceder a la bbdd.

Ñuño Martínez
24/01/2011, 15:22
Eso sí: ten cuidadín con la inyección de SQL. Ya sabes, eso de que pones:


www......com/search.php?pwd=' OR ''='

lo que se traduciría por un


SELECT * FROM usuario WHERE clave='' OR ''=''

El ejemplo es simplón, pero te sorprenderías de la cantidad de weberías "profesionales" que hay por ahí que permiten hacer eso y cosas similares. [Ahhh]

Ya sabes que PHP tiene varias funciones para que no te cuelen SQL ni JavaScript, como el "htmlentities" y los diferentes "escapes", etc.

mahtandakil
24/01/2011, 15:38
Si guardas los datos de conexión encriptados tirando de objetos puedes hacer que esos datos no se lean nunca directamente sino que pasen por una función que se encargue de darte no los datos de conexión sino el resultado de la consulta que hayas realizado.

Otra opción es jugar con permisos de archivos, pero a mí nunca me ha dado seguridad del todo.

tSuKiYoMi
24/01/2011, 15:41
En serio tio, bajate el XAMPP que lo tiene todo y es fácil de activar la seguridad y hacer la administración del servidor, de hecho XAMPP es un apache tomcat con todo el rollo de sql integrado de clavo.

Ñuño Martínez
24/01/2011, 15:46
Por cierto, para gestionar bases de datos MySQL hay varios clientes vía web. El más conocido (por lo que sé) es MyPHPamdin.

Danielo515
24/01/2011, 16:13
ÑUño, como ya he dicho, aunque te agradezco que te preocupes, a todos las variables susceptibles de inyección les aplico las funciones correspondientes, total, para 2 o 3 que hay no tengo problema.

Utilizo php myadmin, que es el que me proveen en mi servidor.

mahtandakil, no se si estarán encriptados o no, pero no es que tenga un script con los datos de la conexión, como tu ya has dicho lo que yo tengo es una clase, ella abre la conexión, envía las consultas y tiene un método para acceder a los resultados. Está muy cuca ella, no se si ya solo porque esté en una clase se considera seguro. ¿Me pudes dar más info?

Lo de xamp está muy bien para el servidor local de mi casa, que es lo que tengo, y en el sí que me permite modificar los permisos de los distintos usuarios sobre la base de datos, pero en el phpmyadmin de mi servidor solo me deja un usuario por base de datos, y no me deja cambiarle los permisos.

mahtandakil
24/01/2011, 16:18
A lo que me refería es que a los datos de usuario y todo eso los encriptes y en el fichero php los pongas encriptados, y que sea la misma función la que los desencripte para realizar la conexión. Así caso que alguien pudiera leer el fichero solo vería código encriptado. Esto no te da seguridad 100% ni mucho menos, pero ya es una barrara más y bastante efectiva.

Danielo515
24/01/2011, 16:22
A lo que me refería es que a los datos de usuario y todo eso los encriptes y en el fichero php los pongas encriptados, y que sea la misma función la que los desencripte para realizar la conexión. Así caso que alguien pudiera leer el fichero solo vería código encriptado. Esto no te da seguridad 100% ni mucho menos, pero ya es una barrara más y bastante efectiva.

A ver si te entiendo, cojo las cadenas y las ofusco con cualquier algoritmo reversible, en plan

$contraseña=f30'3f2@@!!·rdf
$pass=wwer30'3f2@@!!·rdf

Y luego al hacer la conexión, en ese mismo script

conectar(desencriptar($contraseña),desencriptar($p ass))

Algo así?

Ni idea de como hacerlo.[wei]

mahtandakil
24/01/2011, 19:06
Si algo más o menos así sería. Y si ya separas en distintos ficheros las funciones de la base de datos y las de encriptar/desencriptar todavía mejor.

PHP trae una librería para el tema de las encriptaciones, si buscas un poco lo encuentras. Usando eso es relativamente sencillo.

Estopero
24/01/2011, 19:55
Pero quién va a poder acceder al contenido de un fichero php? estaríamos todos perdidos!!! con que un servidor esté medianamente bien configurado y no tenga ninguna fuga grave no debería de haber ningún problema con esto!

Si te quedas más tranquilo, puedes poner el fichero .php con los datos de conexión fuera del directorio público, probablemente un nivel por encima, en los host compartidos suelen estar ahí colocados los logs por ejemplo, y en tu script php de la aplicación hacer un include a ese fichero de configuración. Así "nadie" podría acceder desde el navegador a tu fichero de configuración, pero vamos no me parece una preocupación realmente grave, y menos empezando a desarrollar jeje :)

animanegra
24/01/2011, 20:00
La encriptacion no tiene mucho sentido no?? Si consiguen el codigo fuente de uno en limpio el del codigo de funciones lo conseguiran de forma analoga.

Lo que puedes hacer es poner el inc que incluye tus datos de conexion en un archivo separado de htdocs o dondesea que metas la web. Usease, ponerlo en el directorio anterior, asi no se podra acceder a traves del server web que solo comparte los directorios a partir de /htdocs.

Otra opcion es configurar el .htaccess para que no te permita cargar directamente los archivos sensibles y a ellos tendras que acceder con un include en los php que toquen.

PD: ***** :D posteaste antes que yo ^^

juanvvc
24/01/2011, 20:07
Después discurrir, y discurrir he llegado a la conclusión de que no hay remedio para lo que planteo, ya que debo incluir todos los datos de conexión a la base de datos en un script php, el cual se encarga de todas las consultas. Y eso es lo que quiero saber si tiene algún riesgo, ya que los datos para conectar a la base de datos están ahí, en texto plano. ¿No existe el riesgo de que alguien los coja y se autentique y haga cosas malas?

Para que eso suceda tienen que hackearte el ordenador o que tu hayas metido mucho la pata con la configuración del servidor web. Que la contraseña esté en claro en el PHP/Python/Ruby/loquesea es lo que hacemos todos, así que asegúrate de que:

- el servidor web ejecuta realmente los php, que no los devuelve sin más porque entonces sí que estás vendido :)
- que el usuario de la base de datos de la web no pueda acceder a otras bases de datos
- que tu aplicación PHP está bien protegida contra inyección de código y malos usos de la web. Y esto no es fácil Por ejemplo, si permites que tus usuarios bajen archivos de la web... ¡no permitas rutas completas o relativas como argumento! Es decir, si tus usuarios pueden llamar a "download.php?file=archivo.zip", asegúrate mucho-mucho de que no pueden llamar a "download.php?file=../password.php"
- que los usuarios de tu ordenador están bien configurados y el sistema actualizado

Y todo esto es lo que te han dicho más arriba, así que no estoy añadiendo nada nuevo :D

mahtandakil
24/01/2011, 20:26
Ya se que es prácticamente imposible que se cuelen esos datos, yo solo lo decía como una opción más a contemplar. Total, el sistema no se resiente usando encriptación (si es solo para esto).

Danielo515
24/01/2011, 20:39
Si algo más o menos así sería. Y si ya separas en distintos ficheros las funciones de la base de datos y las de encriptar/desencriptar todavía mejor.

PHP trae una librería para el tema de las encriptaciones, si buscas un poco lo encuentras. Usando eso es relativamente sencillo.

La verdad que lo que propones es una pequeña traba mas,pero a no ser que se implemente algún sistema de clave publica / privada lo único que tienen que mirar es que función uso para desencriptar y a volar. No? Como idea es chachi al menos si acceden solo a uno de los ficheros de nada les sirve.

Y como ya es costumbre.... mas info please

Sent from my GT-I9000 using Tapatalk

mahtandakil
24/01/2011, 20:49
Solo lo he usado una vez, pero toda la info la saqué del manual. Es con la librería crypt, vienen ejemplos, así que se puede implementar 'a pelo' y luego hacer pruebas.

Pasaría el link, pero el foro no me deja ¬¬

Estopero
24/01/2011, 20:53
Y como ya es costumbre.... mas info please

honestamente, no creo que haya mucha más info de la que ya te hemos dado XD

Danielo515
24/01/2011, 21:08
Vale, entonces estoy en lo cierto,la única forma de acceder a la bd es a través de mi página y sus formularios y scripts.
Lo que dices del download supongo que solo sera válid scripts que descarguen cualquier cosa que recibanbpor parámetros no? Te cuento lo que tengo que pueda ser susceptible de ese ataque.
Tengo una página que si no recibe nada como parámetros muestra la galerías , y si recibe algo muestra la imagen correspondiente. Supongo que debería verificar que se trata de una imagen , ya que si no que pasa, saldría por pantalla el archivo en lugar de la imagen? Tengo que verificar eso

< - >

honestamente, no creo que haya mucha más info de la que ya te hemos dado XD

Es que ese comentario se debería haber publicado hace horas. Mierdas de tapatalk.

juanvvc
24/01/2011, 21:18
Tengo una página que si no recibe nada como parámetros muestra la galerías , y si recibe algo muestra la imagen correspondiente. Supongo que debería verificar que se trata de una imagen , ya que si no que pasa, saldría por pantalla el archivo en lugar de la imagen? Tengo que verificar eso

Exacto, me figuraba que tenías algo así :D

Lo ideal es que no se le pase como parámetro el nombre del archivo sino un identificador (por ejemplo, el id dentro de la base de datos) que tú internamente conviertes a un nombre de fichero. O también asegurarte de que el fichero es una imagen, y que no sale del directorio de imágenes y cosas así.

GameMaster
24/01/2011, 21:21
Vale, entonces estoy en lo cierto,la única forma de acceder a la bd es a través de mi página y sus formularios y scripts.

Falso

Danielo515
25/01/2011, 00:12
Exacto, me figuraba que tenías algo así :D

Lo ideal es que no se le pase como parámetro el nombre del archivo sino un identificador (por ejemplo, el id dentro de la base de datos) que tú internamente conviertes a un nombre de fichero. O también asegurarte de que el fichero es una imagen, y que no sale del directorio de imágenes y cosas así.

Muchas gracias por tu sugerencia, al final lo he hecho pasando la ID de la imagen como parámetro y haciendo una búsqueda en la base de datos, ha sido mucho más sencillo de lo que me esperaba, y la verdad, muy eficiente, muchas gracias.


Gamemaster, pero no nos dejes así hombre, después de haberte currado semejante frase con tanto colorido. Ilumínanos un poco más hombre!

< - >

No confiar never of ever en cualquier entrada que provenga del navegador de los usuarios, por ejemplo para determinar si la imagen es lo que dice ser, no confíes en el mime del formulario, como ahora, y de momento no doy más pistas por si puedo conseguir algo, sino que por ejemplo, una vez subida la imagen volvería comprobar con file u otra herramienta si el fichero es lo que parece.

Y quien dice ese caso, dice para cualquier otra cosa que se te ocurra.

Eso de si puedo conseguir algo suena realmente mal colega.

como ya he dicho, ya no me fío de lo que me pasan por parámetro en el navegador (el único script que lo hacía) y el formulario, bueno, solo acepta imágenes.

Si claro, intentarás meter código php en los comentarios de las imágenes, la verdad, no se si servirá ya que hago bastantes operaciones con la imagen antes de guardarla tales como redimensionarla, pegarle cosas encima, etc.

GameMaster
25/01/2011, 08:27
No conoces MySql editor o similares ?! Pues para editar la BD no tiene que ser por páginas chorras de php, puedes modificar las tablas con un cliente MySql y olvidarte de hacerlo a traves de páginas php xDDD

Danielo515
25/01/2011, 22:19
No conoces MySql editor o similares ?! Pues para editar la BD no tiene que ser por páginas chorras de php, puedes modificar las tablas con un cliente MySql y olvidarte de hacerlo a traves de páginas php xDDD

Graciosete! Me refiero a auna persona tercera sin más acceso que mi propia página.