2010-02-08 10 views
5

He hecho un poco de programación web (usando PHP y MySQL), pero nada demasiado grande en escala. He estado pensando en cómo alguien crearía un tipo de sitio de redes sociales y me encontré con algunos problemas.Tengo algunas preguntas sobre el desarrollo web (PHP y MySQL)

  • ¿Cómo almacenaría de forma segura las contraseñas en MySQL? ¿Qué tipo de encriptación usarías?
  • Si los usuarios podían cargar imágenes, ¿sería mejor almacenarlas en la base de datos o cargarlas directamente en el servidor?
  • ¿Qué aplicaciones web de código abierto (como WordPress) recomendaría que leyera y estudiara (preferiblemente algo simple pero bien escrito)?

Todo lo enseñado en clase o escrito en libros simplemente no parece traducirse bien en el código de producción real. Simplemente parecen ejemplos muy básicos.

Gracias!

Respuesta

0

Para el almacenamiento de contraseñas, sugiero usar MD5 con una sal. MD5 es imposible de descifrar, pero es posible agrietar usando tablas de arcoiris. Por ejemplo: Here is a MD5 lookup site I've coded

Personalmente los cargaría directamente al servidor, sin embargo, debe asegurarse de que solo se carguen los archivos de imagen válidos. No quiero que alguien cargue una raíz.

+1

MD5 en realidad se considera roto en la actualidad. No lo use en absoluto. –

+2

¿De verdad? Romperlo: fb922e006b2bde97591200f956bb9e33 – Rob

2
  1. Almacenar un hash salado. Me alejaría personalmente de md5 y usaría algo como sha en su lugar. sha1 + salt resistirá por un tiempo =]

  2. Si almacena las imágenes como blobs en la base de datos, probablemente le sea más fácil en el futuro respaldarlas (junto con el archivo db, ir a buscarlas) , etc.) Pero en realidad, también serán muy rápidos en el sistema de archivos, pero los preferiría en la base de datos ya que tengo muchos códigos que interactúan con la base de datos y me siento cómodo trabajando en esa área. Eso depende de usted.

  3. No estoy seguro de que wordpress te ayude a construir un sitio de redes sociales ... pero sigue siendo bueno leer el código de otros. Echaré un vistazo a algunos libros sobre arquitectura en amazon solo para que tu mente piense a gran escala. Además, eche un vistazo a algunos libros de patrones de diseño.

También me gustaría ver algo como el Zend Framework o CakePHP. Cake probablemente te ayude a funcionar bastante rápido, pero prefiero Zend, ya que es muy poderoso y no te obliga a codificar un estilo determinado. CakePHP es un poco como los rieles para PHP.

También querrá obtener decente a la seguridad, tanto del lado del servidor y el cliente, en busca de cosas como el secuestro de sesión, inyección SQL, XSS, intentos de fuerza bruta, a distancia incluye, explota archivos subidos, etc.

Los sitios sociales ofrecen muchos vectores de ataque a los crackers.

Recursos:

+4

No estoy de acuerdo con las imágenes que están en el archivo db. Si hay muchos usuarios cargando imágenes, la base de datos se hinchará en muy poco tiempo, y las copias de seguridad en db serán un problema con todas las imágenes – AntonioCS

+0

Eso es justo, pero es por eso que tiene tablas, incluso podría tener una base de datos separada para tales artículos y algunas rutinas que incluyen cosas como imágenes/avatares en Memcache para un acceso realmente rápido. No estoy seguro de que tenga mejores imágenes la idea de tener imágenes en el sistema de archivos. –

+0

Para un sistema pequeño, almacenar imágenes en su DB está bien. Para cuando su conjunto de datos se haya convertido en varios GB, no le va a gustar su decisión de diseño anterior. Esta discusión se ha hecho a muerto, no repita el mismo error una y otra vez. – Jacco

1

Para el almacenamiento de imágenes, siempre he usado para almacenarlos en el disco duro, pero utilizando un script de validación imagen muy duro para asegurarse de que las imágenes no contienen código malicioso. También me utilizan para aplicar la reescritura de URL para que los usuarios no puedan encontrar la ruta real a las imágenes.

¿No tiene una sensación extraña al almacenar imágenes en las bases de datos? La base de datos mysql puede crecer muy rápido, y siempre necesitará un script PHP para mostrar las imágenes, lo que significa que hace que su servidor sea más lento.


En cuanto al almacenamiento de contraseñas, el uso de salado como los otros respondió.


Por último, para la documentación, me encanta ver cómo está estructurado Wordpress. He pasado horas mirando su código fuente y leyendo sus documentos. Es solo un ejemplo terriblemente bueno de cómo organizar cualquier sitio web.

1
  1. Aplicar una función hash a la contraseña (como sha1 o md5). Luego agregue "sal" extra tomando como los primeros 5 caracteres de md5 ("social") o algo así. Depende de usted, pero esto es así para que, si un hacker obtiene acceso a su base de datos, él/ella no podrá ejecutar sus contraseñas hash a través de una tabla de arco iris y obtener la contraseña real.
  2. Estoy ejecutando un sitio web que permite a los usuarios subir imágenes. Las imágenes están organizadas en contenedores (es decir, 1.000 imágenes por contenedor) solo para mantenerlo organizado (y solo puede tener tantos archivos por carpeta antes de tener problemas). La ubicación de las imágenes se almacena en la base de datos y en otra información (como ID de imagen, extensión de archivo, ubicación de ubicación, etc.). Otra tabla en la base de datos vincula los identificadores de imágenes a un usuario. Además, el nombre de archivo de la imagen una vez que su subido es algo así como

    {bin}/{userId}_{pictureId}_{token}_{variant}.{fileExt}

  3. No está seguro acerca de las aplicaciones web, pero además se debería hacer uso de algunas clases incorporadas de PHP como la capa de abstracción de base de datos PDO.

+0

MD5 y SHA1 ya no se consideran seguros. Use SHA256 o mejor aún BCRYPT – Jacco

+0

No creo que deba importar ya que está salando las contraseñas? No va a ser un puro hash MD5 o SHA1 – axsuul

0

Pregunta 3: Yo sugeriría el estudio de uno de los modernos marcos de estilo rieles (mi favorito es Symfony) en lugar de una aplicación como Wordpress o Galería. Ambos son excelentes, pero han evolucionado a partir de simples ataques y no son necesariamente la forma en que comenzaría cualquier cosa si estuviera empezando desde cero.

Además, para la pregunta 2, odio blobs binarios en las bases de datos. Los sistemas de archivos funcionan muy bien para eso.

Y pregunta 1: hash unidireccional, como han dicho otros. La función de contraseña de Mysql probablemente esté bien.

0

Todas estas preguntas han sido respondidas antes.

¿Cómo almacenaría de forma segura las contraseñas en MySQL? ¿Qué tipo de encriptación usarías?

Ver https://stackoverflow.com/search?q=password+hash+database+php

Si los usuarios se les permitió subir fotos, sería mejor para almacenarlos en la base de datos o hacer que subido directamente al servidor?

Ver https://stackoverflow.com/search?q=store+images+database+php

Lo abierta aplicaciones web de código (como WordPress) me recomiendan que leo y estudio (de preferencia algo simple pero bien escrito)?

Ver https://stackoverflow.com/search?q=social+network+php

También debe tener en cuenta que ejecutar y administrar un sitio de red social es algo más que la codificación de la misma. ¿Estás seguro de que quieres construir uno desde cero? Considera si estarías igualmente feliz con algo como Ning, donde todos pueden comenzar su propia comunidad sin programación alguna.

Cuestiones relacionadas