Ir al contenido
Conéctate para seguir esto  
The_Code

¿Que tan malo puede ser programar una web con "base de datos" en PHP?

Recommended Posts

¡Hola chicos! ¿Cómo andan? Quería consultarle a algún programador web de verdad (porque sólo soy un aficionado) sobre lo que está bien y está mal.

Planteo el caso y al final dejo las preguntas:

 

Lo poco que sé de MySQL, quedará sin soporte en los próximos meses, sé que MySQLi / MariaDB son bases de datos muy confiables, open-source y todo muy lindo, pero no tuve tiempo de ponerme de verdad con ellas, y tampoco sé si tengo tantas ganas de curtirme tanto en esta área web (más bien creo que prefiero el desarrollo creativo de productos, diseño/programación de videojuegos y aplicaciones).

 

Pero una cosa sí la sé clarito, y es que estoy desarrollando una consola de videojuegos "retro" dónde además de hacer lo clásico que hacen por estos lares (agarrar una Rpi3 con un gabinete chino y venderlo a $4000 ARS con 32GB y sin joystick), también estoy haciendo cuentas de usuario, sincronización de partidas online para que el jugador pueda seguir su partidas desde cualquier dispositivo, dos joysticks, sistema de logros, etc. El precio será un poquito por debajo que el de la competencia a pesar de tener todas estas bondades de más :D

Para todo esto, lógicamente, necesito un sitio web para complementar muchas cosas del producto. Desde su anuncio, la atención post-venta y el soporte de partidas/perfiles/etc.

 

El "problema" es que el sistema de usuarios está programado enteramente en PHP sin base de datos. Planeo pagarle a un programador de verdad si este proyecto realmente tiene éxito, caso contrario no veo el porqué de invertir en algo que se muere antes de comenzar (en el hipotético caso de que suceda, aunque estoy poniendole toda la garra y tengo gente que me ayudará con el marketing local) :D

Si el proyecto tiene éxito lanzaría una segunda versión de la consola al cabo de un año y medio después, aproximadamente. (Seguro basado en una Raspberry Pi 4 o un motherboard con Intel soldado más potente... eso se verá porque la idea siempre fue mantener un buen precio).

 

Teniendo todo esto en cuenta, ¿ven realmente malo tener un sistema de usuarios sin BD? Es que realmente está corriendo super bien y las pruebas van excelente.

Lo único que me faltaría es agregar seguridad frente a Ataques XSS y demás métodos (tendré que investigar)... justamente eso creo que es un pro. Porque al no tener base de datos no sería vulnerable a las clásicas inyecciones SQL, por ejemplo.

 

El sistema es bien simple y práctico. En el Login tengo dos campos de texto:

- Usuario (variable llamada $user)

- Contraseña (variable llamada $password)

 

XsmWHEp.png

 

Al introducir tu usuario y contraseña, busca la carpeta usuario/$user y si existe busca un archivo en formato PHP que se aloja ahí dentro y sólo tiene una línea de código.

$user_password = "test";

Entonces, si se pudo entrar a dicha carpeta del usuario (caso contrario, el usuario no existe), se comprueba si la contraseña escrita es la misma que la hallada en la carpeta del user y listo, entra a tu perfil dónde se lista cada consola donde jugaste y tienes una partida dentro, algo así se verá :D

 

iWWuhwT.png

 

Si quisiera editar el nombre de usuario, simplemente la función rename() de PHP hace eso. Al loguearte metes tu usuario nuevo y si coincide con alguna carpeta dentro de /usuario/ chequea si las contraseñas coinciden y listo.

Luego, si quieres hacer de tu perfil algo público, un link te creará una página .php nueva con tus datos y listo, cualquiera (tenga cuenta o no) podrá ver tu perfil con sus respectivos logros, tu avatar, tus consolas favoritas (no así, tus partidas), etc.

La página de editar perfil es algo así, próximamente deberé añadir la opción de cambiar contraseña:

 

Mt6uZTO.png

 

¡Y con solo PHP puedo hacer esto y más! Pido el nombre de usuario y contraseña porque aún no implementé las cookies, lo haré cuándo esté todo terminado así no me lío borrando siempre el historial para cada cambio bobo :P

 

Honestamente es todo muy sencillo, pero tremendamente eficiente. El sistema en si es un poco más complejo, pero como domino bastante bien el PHP ha sido todo muy fácil :D

A nivel seguridad, el servidor no permite acceder a ninguna carpeta escribiendola en la barra de direcciones. Por ejemplo, suponiendo que mi dominio es test.com.ar, no puedo ingresar a test.com.ar/css y ver todo el contenido de la carpeta ni navegar por el servidor. Suponiendo que sepa la dirección exacta del archivo donde se guarda la contraseña de un usuario, tampoco puedo entrar metiendo el nombre desde la barra de direcciones. Bah, puedo entrar pero el navegador no muestra nada cuándo quiero ver el código 😮

 

Creo que con wget se podría bajar el sitio web completo para inspeccionarlo, pero eso creo que también depende de si el servidor lo permite y si incluso no se bajan los archivos ya procesados 😮 La verdad que no probé nunca.

 

 

Resumiendo, las preguntas:

1) ¿Tener una web sin base de datos y con PHP puro, representa alguna falla de seguridad "de más" que si tuviera una BD basada en MariaDB, por ejemplo?

2) ¿Por qué las webs están basadas en BDs siempre? ¿Por estándar o porque realmente es mejor?

3) En este caso, dónde la interacción con la web es liviana (es decir, no es ni será una red social)... sólo un sitio web donde verás las novedades del emprendimiento y si tienes cuenta podrás ingresar para hacer unos cambios en tu perfil, ir a otra página de mi emprendimiento a comprar hardware (si quieres) y luego ir a otra parte de la página para suscribirte a alguna cosita (tengo pensado hacer una web de enseñanza/tutoriales/asistencia tanto en el ámbito informático como el laboral).

¿Es necesario una BD para algo así de básico?

4) (leer cita) Independientemente de que tenga éxito o no el proyecto, ¿es realmente necesario montar todo sobre una base de datos?

Cita

El "problema" es que el sistema de usuarios está programado enteramente en PHP sin base de datos. Planeo pagarle a un programador de verdad si este proyecto realmente tiene éxito

 

Asumo que no tener base de datos hace todo más rápido :D Ha ido como la luz hasta ahora.

 

EDIT: Incluso si no uso cookies, estaría liberando al usuario de otro posible ataque XSS. Es algo a evaluar, porque en realidad el login lo necesito sólo en dos páginas (máximo), y el usuario comúnmente sólo iniciará sesión en una.

El sitio web tampoco ofrece la posibilidad de borrar las partidas del jugador (es algo sin sentido, creo).

 

EDIT 2: Hoy (2 de mayo) me puse a proteger el sitio de XSS y estoy usando:

- strip_tags: para eliminar los caracteres relacionados con tags HTML.

- str_ireplace: para reemplazar ciertos caracteres que podrían formar tags HTML (gracias a la tabla de códigos ASCII; ejemplo: el código &#60 forma el pico de apertura de tag HTML "<") sin importar si son lower o upper case :D .

- htmlspecialchars: para volver a sanear los datos cuándo los muestro en pantalla.

 

También me bajé el sitio (ya subido al servidor, para probar) con wget -r -page-backup para descargarlo todito y de manera recursiva, pero se descargó como sospechaba... La carpeta que contiene todos los usuarios y sus partidas y la otra carpeta (donde tengo archivos .php que los llamo cuando necesito alguna función extra) no fueron descargadas. Luego, de las 7 páginas que tengo en el directorio raíz (todas con extensión .php) sólo dos fueron descargadas (index y la pagina del login) y para colmo el index.php fue convertido a .html solito :P

 

¿Se les ocurre algo más?

Editado por The_Code

Compartir este post


Enlace al post
Compartir en otros sitios

Pues con lo que ya sabes ya nos podrias dar clases a algunos en mi caso por ejemplo .

 

Bueno la levianez de un sitio web la consigues de dos formas usar HTML y CSS si puedes solo eso junto a la BD si quieres tener opcion de logeo y sesion usuario en el sitio.

No uses java-script ni na de java ya que es enemigo de la fluidez y seguridad de un sitio web.

 

Eso es todo lo que se, MariaDB la vi en Slackware el MySQL lo mire en un curso pero no me acuerdo de nada solo y apenas hablamos de generalidades de el ni lo tocamos.

 

Es eso felicitarte por ese trabajo que estas haciendo yo ya hice páginas web para mi y me gusto pero solo el tema de HTML y CSS lo demas nunca hice nada.

Compartir este post


Enlace al post
Compartir en otros sitios
hace 50 minutos, portaro dijo:

Pues con lo que ya sabes ya nos podrias dar clases a algunos en mi caso por ejemplo .

 

Bueno la levianez de un sitio web la consigues de dos formas usar HTML y CSS si puedes solo eso junto a la BD si quieres tener opcion de logeo y sesion usuario en el sitio.

No uses java-script ni na de java ya que es enemigo de la fluidez y seguridad de un sitio web.

 

Eso es todo lo que se, MariaDB la vi en Slackware el MySQL lo mire en un curso pero no me acuerdo de nada solo y apenas hablamos de generalidades de el ni lo tocamos.

 

Es eso felicitarte por ese trabajo que estas haciendo yo ya hice páginas web para mi y me gusto pero solo el tema de HTML y CSS lo demas nunca hice nada.

¡Gracias! Y si, además muchas cosas que la gente hace con Javascript se pueden hacer hoy con HTML5+CSS3. Un ejemplo claro es hacer un menú que se oculta y con un link se desliza. Ya no le veo mucho sentido salvo que uses jQuery, pero siempre mi idea fue ir por lo liviano (pensando en esas conexiones de 3 Megas que todavía hay acá o para ahorrar datos móviles), así que esa librería no está presente en mis diseños :P

 

Yo no soy ningún super programador. Por el contrario, todo lo que aprendí de Buildroot y PHP lo hice con este proyecto en particular. Creo que no hay mejor manera de aprender que experimentando. De hecho, a esta altura casi puedo decir que puedo armar un CMS como el que estoy programando pero sin Googlear nada (como sí hice en esta primera ocasión). Y es que la práctica hace al maestro. Estos días han sido pura inspiración y aprendí mucho de un sopetón.

 

¡Ojo! Este especie de CMS que estoy armando se basa, sin contar las funciones que uso para seguridad (evitar ataques XSS más que nada), en apenas 7 funciones, todo lo demás es imaginación:

 

- isset(): para comprobar que una variable está seteada y no vacía.

- file_exists(): para comprobar si dicho usuario existe para luego mostrar sus datos, primero chequeo si existe su correspondiente carpeta. Si existe la carpeta es porque hay usuario. Luego hago otra comprobación (porque puede haber una carpeta de un usuario que se cambió el nombre (más abajo entenderás porqué sucede esto en mi sistema), que se basa en chequear si el archivo con los datos de usuario existe. Si no existe ese archivo, el sistema no tiene como comprobar si la contraseña insertada por la persona es idéntica a la guardada en el servidor. Conclusión: lanza un mensaje de que ese usuario "está suspendido".

- rename(): para editar el nombre de la carpeta del usuario, una vez que se cambia el nombre de usuario. Obviamente esto ocurre sólo si la persona no desea su nick por defecto, que comienza como "jugador" y finaliza con el número de la consola. Suponiendo que tú compraste la primer consola, tu nick sería "jugador0001" ;)

- mkdir(): como la consola seguirá buscando la carpeta original con la que fue configurada al "salir de fábrica", debo crear la carpeta vieja del nombre de usuario viejo con un archivo. Ese archivo es de extensión .sh (bash) y cuándo la consola se dirija a la carpeta habitual, levantará este archivo.sh con una variable que apunta a la carpeta nueva del usuario. A partir de allí, apuntará siempre a la carpeta nueva del usuario, ya que la variable dentro del BASH indica eso: la nueva ruta correspondiente al cambio de nombre de usuario; Esta función todavía no la llevé a la práctica pero debería funcionar perfecto.

- fopen() / fwrite() / fclose(): para abrir, escribir y luego cerrar de manera segura el archivo. Esto lo uso más que nada a la hora de crear el archivo BASH en la carpeta vieja del usuario. Es decir, se ejecuta luego de mkdir.

 

Luego, para lo que es seguridad las 3 funciones siguientes cumplen lo básico:

- strip_tags()

- str_ireplace()

- htmlspecialchars()

 

Tal vez use Argon21 para darle más seguridad a las contraseñas de extremo-a-extremo: https://wiki.php.net/rfc/argon2_password_hash

 

Realmente es un placer estar aquí, son tremendamente agradecidos y buena gente.

Volviendo al tema, cuándo todo el sistema esté terminado y la consola a la venta, sólo tardaré unas semanas en largar la ISO customizada de Recalbox y probablemente este sistema en PHP, que por cierto lo estoy comentando y tal vez te guste para aprender, si tienes tiempo :D

 

La decisión de hacer la consola Open-Source viene más porque al no poder exportar el producto (no tiene sentido si todas las piezas hardware no salen de mi país, es decir, no vale exportar algo que tiene como materia prima algo importado y representa el 75% del costo del producto) no puedo llegar a todos como quisiera. Si a alguien le gusta la idea, sin problemas puedo dejarla en la red (es la idea).

 

Además, hacer de el proyecto algo Open-Source tampoco que me va a quitar necesariamente ventas, porque el que no sabe, no sabe y punto. Tal vez lo intente, pero de ahí a que quede mejor o igual que lo mio es otra cosa (ojo, no es de agrandado, pero es como que yo haga plomeria sin saber, con tal de ahorrarme una moneda).

Editado por The_Code

Compartir este post


Enlace al post
Compartir en otros sitios

Ojo, Javascript se está usando cada vez más en el lado servidor y ganando terreno a php.  Y no tiene nada que ver con Java xD. 

En cuanto a tu proyecto, es tu idea, quizás estés redescubriendo la rueda, pero te diría que una base de datos suele haber en prácticamente todas las aplicaciones.  Otra historia es que sea relacional (sql), documental (json), o de otro tipo.  Las hay que solo existen los datos temporalmente en memoria como Redis que igual te interesa.

Compartir este post


Enlace al post
Compartir en otros sitios
hace 10 horas, Rohlling dijo:

Ojo, Javascript se está usando cada vez más en el lado servidor y ganando terreno a php.  Y no tiene nada que ver con Java xD. 

En cuanto a tu proyecto, es tu idea, quizás estés redescubriendo la rueda, pero te diría que una base de datos suele haber en prácticamente todas las aplicaciones.  Otra historia es que sea relacional (sql), documental (json), o de otro tipo.  Las hay que solo existen los datos temporalmente en memoria como Redis que igual te interesa.

Lo de Redis no lo entendí bien, simplemente el cerebro no lo procesó jajaja.

 

Estuve viendo y los CMS "sin base de datos" en realidad si tienen una, generalmente en "Markdown" / "Json". Lo malo de estos archivos es que cuánto más grande se hace el sitio web (más posts creados e indexados, más fotos subidas, etc) más grande se hace la base de datos json, que es un archivo "central" que almacena todo.

 

Entonces si, creo que reinventé la rueda. ¿Por qué? Bueno, porque mi sistema no tiene una base de datos. De hecho, debería cambiarle el título a este post por: ¿Que tan malo puede ser programar una web dinámica sin base de datos?

Mi sitio web inserta el concepto de base de datos descentralizada, Vi el concepto de "base de datos distribuida" (ya su nombre lo aclara: pequeñas BDs, cada una para una situación o petición particular) pero no lo que estoy haciendo yo. No sé si alguien lo hizo antes pero me siento muy crack porque por ahora no encontré nada sobre esto jajaja.

 

Supongamos que tengo mi web con base de datos. Cuándo quiero hacer login el servidor debe:

- Hacer una conexión con la base de datos.

- Ingresar a la tabla de los usuarios.

- Se compara la variable $user y $pass con las de la BD. Generalmente la contraseña está hasheada.

- Una vez que el PHP corrobora que el usuario y contraseña son idénticos, se sirve la página con el Log In + Cookies correspondientes.

 

En mi caso, todo es más simple (y eso no siempre quiere decir notablemente más rápido):

- Se busca el directorio del usuario (variable $user) y su contraseña ($pass) en el archivo contrasena.php, dentro de la carpeta de usuario.

- Se entrega la página mi-perfil.php con el Log In.

 

¿Como se maneja mi web? Bueno, de una manera muy similar a cómo un formulario convencional...
 

<form action="login.php" method ="post">
  <input type="text" name="usuario" />
</form>

 

...le envía variables a una página para procesar esos datos
 

<?php
  $usuario = $_REQUEST['usuario'];
  echo $usuario;
?>

 

Por eso la web es tan ligera :D Ahora el servidor corre Apache, pero leí que con nginx es mucho más veloz y las optimizaciones que tenga PHP a lo largo de sus versiones impactará directamente en el rendimiento de mi CMS.

Lo próximo sería, en caso de que tenga más páginas que requiera un Log In, meterle cookies para no obligar al usuario meter siempre sus credenciales.

 

Me voy a quedar con este sistema porque:

- Es más fácil y preciso hacer backups (malas experiencias exportando BD de Wordpress) y que quede el sitio IGUAL.

- Es realmente sencillo para administrar y aprender.

- Va a ser tan expandible como mi conocimiento me permita :v

Compartir este post


Enlace al post
Compartir en otros sitios

Te deseo todos los éxitos con lo que estas desarrollando @The_Code :)

 

Nginx está bien documentado y si que es verdad que es mucho más ligero que Apache, eso se nota y mucho en una R-PI.

 

Parece buena idea usar Argon2 para darle seguridad a las contraseñas de la db.

En mi caso con una R-Pi3  pude compilar e instalar el modulo Argon2, me funciono bien en el terminal linux pero en php no era reconocido aunque tuviera el modulo correspondiente instalado y configurado para ser usado. Seguramente me faltó configurar algún parámetro o permiso de usuario...

Compartir este post


Enlace al post
Compartir en otros sitios
Te deseo todos los éxitos con lo que estas desarrollando@The_Code 
 
Nginx está bien documentado y si que es verdad que es mucho más ligero que Apache, eso se nota y mucho en una R-PI.
 
Parece buena idea usar Argon2 para darle seguridad a las contraseñas de la db.
En mi caso con una R-Pi3  pude compilar e instalar el modulo Argon2, me funciono bien en el terminal linux pero en php no era reconocido aunque tuviera el modulo correspondiente instalado y configurado para ser usado. Seguramente me faltó configurar algún parámetro o permiso de usuario...
Hola! La idea es tener una linda Raspberry Pi como servidor... Pero tengo que crecer para eso (tengo 18 y no me van a dejar tocar el router en casa jajaja). Supongo que cuando me mude estará la Pi4 :D
Argon21 entonces, debido a que necesito un módulo, tendré que preguntar al que le pago el servidor (DonWeb) para que agregue ese módulo... si es posible jajaja

Gracias por los éxitos! Muero de ansias por mostrar el producto terminadito :D

Enviado desde mi SM-G965F mediante Tapatalk

Compartir este post


Enlace al post
Compartir en otros sitios

Registra una cuenta o conéctate para comentar

Debes ser un miembro de la comunidad para dejar un comentario

Crear una cuenta

Regístrate en nuestra comunidad. ¡Es fácil!

Registrar una cuenta nueva

Iniciar Sesión

¿Ya tienes cuenta? Conéctate aquí.

Iniciar Sesión
Conéctate para seguir esto  

×