User Tools

Site Tools


proyecto:armar_la_aplicacion_inicial

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
proyecto:armar_la_aplicacion_inicial [2022/04/20 06:27] – se ha restaurado la vieja versión (2021/11/14 17:31) ahoganproyecto:armar_la_aplicacion_inicial [2023/04/27 20:10] (current) sferrada
Line 6: Line 6:
  
    * Como fue mencionado antes, hay que tener al menos tres consultas demostrando una mezcla de rasgos de SQL, es decir, joins, consultas anidadas, agregación, etc.     * Como fue mencionado antes, hay que tener al menos tres consultas demostrando una mezcla de rasgos de SQL, es decir, joins, consultas anidadas, agregación, etc. 
 +   * Al menos dos de las consultas deberían incluir uno o más parámetros ingresados por el usuario de la aplicación web.
    * No es necesario tener todos los rasgos en todas las consultas. La idea es que se demuestren los rasgos en alguna consulta. Se puede empezar con una consulta simple.    * No es necesario tener todos los rasgos en todas las consultas. La idea es que se demuestren los rasgos en alguna consulta. Se puede empezar con una consulta simple.
    * Es importante usar indices, vistas, etc., para optimizar las consultas.    * Es importante usar indices, vistas, etc., para optimizar las consultas.
Line 17: Line 18:
  
 Independientemente de la opción que se elija, la seguridad de la aplicación será parte de la evaluación del proyecto, así que hay que: Independientemente de la opción que se elija, la seguridad de la aplicación será parte de la evaluación del proyecto, así que hay que:
- +  * Usar sentencias precompiladas. 
-  * Usar sentencias precompiladas (prepared statements) o algo similar en el software elegido para evitar inyección (y vulnerabilidades similares)+  * Crear un usuario para la aplicación que tenga solo el acceso mínimo requerido (si es que no se usa Django). 
-  * Crear un usuario para la aplicación que tenga solo el acceso mínimo requerido +
  
 Con respecto al último punto, la idea es no usar un superuser ''cc3201'' en la aplicación con acceso a todo, sino crear un usuario nuevo (p.ej. ''webuser'') con una contraseña (ojo: será más fácil si se evitan espacios y "caracteres especiales" y si se usan sólo caracteres alfanuméricos) y permitirle solo acceso de lectura a las tablas pertinentes con ''GRANT'', p.ej.: Con respecto al último punto, la idea es no usar un superuser ''cc3201'' en la aplicación con acceso a todo, sino crear un usuario nuevo (p.ej. ''webuser'') con una contraseña (ojo: será más fácil si se evitan espacios y "caracteres especiales" y si se usan sólo caracteres alfanuméricos) y permitirle solo acceso de lectura a las tablas pertinentes con ''GRANT'', p.ej.:
  
-<code>GRANT USAGE ON SCHEMA test TO webuser;+<code> 
 +CREATE USER webuser WITH PASSWORD 'contrasena'; 
 +GRANT CONNECT ON DATABASE cc3201 TO webuser; 
 +GRANT USAGE ON SCHEMA proyecto TO webuser;
 ... ...
-GRANT SELECT ON test.hello TO webuser;</code>+GRANT SELECT ON proyecto.tabla TO webuser; 
 +</code>
  
 ... y después usar ''webuser'' y su contraseña en la aplicación. Hay más información sobre [[https://www.postgresql.org/docs/11/static/sql-grant.html|GRANT aquí]]. ... y después usar ''webuser'' y su contraseña en la aplicación. Hay más información sobre [[https://www.postgresql.org/docs/11/static/sql-grant.html|GRANT aquí]].
 +
 +Hay que tener cuidado con consultas como:
 +
 +<code>
 +SELECT * FROM tabla WHERE col = 'val';
 +</code>
 +
 +En particular, esta consulta no ha especificado el esquema, así que Postgres usará el ''SEARCH_PATH'' del usuario para identificar el primer esquema con la relación ''tabla''. Pero ''webuser'' puede tener un ''SEARCH_PATH'' diferente al ''SEARCH_PATH'' de ''cc3201''. Una solución sería definir bien el ''SEARCH_PATH'' de ''webuser'', pero ojo que si cambia el ''SEARCH_PATH'' en el futuro, la aplicación puede dejar de funcionar. Si una consulta va a ser usada durante mucho tiempo (por ejemplo, está codificada en una aplicación), la mejor solución es siempre especificar los esquemas de las tablas (o de las vistas, etc.) referenciadas:
 +
 +<code>
 +SELECT * FROM esquema.tabla WHERE col = 'val';
 +</code>
 +
 +Así funcionará ante cambios al ''SEARCH_PATH'' del usuario de la aplicación.
 ===== Servidor Web ===== ===== Servidor Web =====
  
 Hay que eligir una sola opción aquí. Hay que eligir una sola opción aquí.
  
-La primera opción es de un nivel más bajo y (para Aidan, que fue quien redactó esto), es un buen lugar para empezar. En particular, uno puede empezar rápidamente con ejemplos simples usando PHP.+La primera opción (PHP) es de un nivel más bajoy uno puede empezar rápidamente con ejemplos simples usando PHP.
  
-La segunda opción es un ejemplo de framework MVC, el uso del cual es popular hoy en día. Ofrece una abstracción de nivel más alto, pero hay que aprender y configurar mucho.+La segunda opción (Django+Python) es un ejemplo de framework //Model-View-Controller// (MVC), el uso del cual es popular hoy en día. Ofrece una abstracción de nivel más alto, pero hay que aprender y configurar mucho.
  
-Se puede eligir otra opción también. El curso no se trata del desarrollo de aplicaciones webasí que no importa qué opción se prefiere con respecto a la evaluación final (solo importan el resultado final y la seguridad).+La tercera opción (Java Servlets) queda un poco desactualizadapero todavía hay varios sistemas legados que las usan. Se recomienda en el caso de realmente querer programar en Java.
  
-Cabe señalar que no todo lo que necesitan se encuentra aquí, esto les dará las bases, pero usted debe buscar la manera de arreglar el html el uso de css, por ejemplo+Se puede eligir otra opción también. El curso no se trata del desarrollo de aplicaciones web, así que no importa qué opción se prefiere con respecto a la evaluación final (solo importan el resultado final la seguridad).
  
 **Nota 1**: Durante el tutorial se pedirá usar: **Nota 1**: Durante el tutorial se pedirá usar:
Line 58: Line 76:
 ... aceptando cada vez que pida confirmación. Esto es necesario hacerlo solo una vez. [[https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=245022|Fuente]] ... aceptando cada vez que pida confirmación. Esto es necesario hacerlo solo una vez. [[https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=245022|Fuente]]
  
-**Nota 2**: Durante el tutorial se pedirá instalar cierta versión de algún paquete, ejemplo: +**Nota 2**: Si al intentar actualizar o ejecutar algo sale este error:
-<code> +
-sudo apt-get install tomcat7 +
-</code> +
-Pero si dicho paquete no se encuentra,  +
-<code> +
-E: Unable to locate package tomcat7 +
-</code> +
- +
-... probar buscando si el paquete se encuentra en otra versión: +
- +
-<code> +
-apt-cache search tomcat +
-</code> +
-<code> +
-... +
-tomcat9 - Apache Tomcat 9 - Servlet and JSP engine +
-tomcat9-admin - Apache Tomcat 9 - Servlet and JSP engine -- admin web applications +
-tomcat9-common - Apache Tomcat 9 - Servlet and JSP engine -- common files +
-tomcat9-docs - Apache Tomcat 9 - Servlet and JSP engine -- documentation +
-tomcat9-examples - Apache Tomcat 9 - Servlet and JSP engine -- example web applications +
-tomcat9-user - Apache Tomcat 9 - Servlet and JSP engine -- tools to create user instances +
-... +
-</code> +
- +
-... en este caso encontramos la versión 9. +
- +
-**Nota 3**: Si al intentar actualizar o ejecutar algo sale este error:+
 <code> <code>
 E: You don't have enough free space in /var/cache/apt/archives/. E: You don't have enough free space in /var/cache/apt/archives/.
Line 103: Line 94:
 ==== Opción 1: Apache2 + PHP ==== ==== Opción 1: Apache2 + PHP ====
  
-  * PRO: más fácil de instalar y se puede empezar rápidamente con algunos ejemplos +  * PRO: más fácil de instalar y se puede empezar rápidamente con algunos ejemplos. 
-  * CON: hay que programar en PHP+  * CON: hay que programar (un poco) en PHP.
  
-Apache2 es un servidor web. PHP es un scripting language. Armaremos Apache2 y crearemos la aplicación después con PHP. +Apache2 es un servidor web. PHP es un scripting language que podemos mezclar con HTML. Armaremos Apache2 y crearemos la aplicación después con PHP.
- +
-Antes de instalar apache2, si Tomcat fue instalado antes, sería una buena idea deshabilitarlo (si no fue instalado, no hay problema): +
- +
-<code>sudo service tomcat7 stop</code>+
  
 === Instalar apache2 === === Instalar apache2 ===
Line 121: Line 108:
 </code> </code>
  
-Para verificar que funcione, se puede ir a (siendo ''XX'' el número del grupo):+Para verificar que funcione, se puede ir a (siendo ''XX'' el número de la máquina):
  
 <code> <code>
Line 127: Line 114:
 </code> </code>
  
-Apache Web Server (apache2) interpretará las peticiones de HTTP y las traducirá a operaciones locales en el servidor. Con apache2 se pueden servir páginas estáticas en HTML, pero para crear la aplicación, claramente necesitaremos algo dinámico. Hay varias opciones pero describiré una opción usando PHP.+Apache Web Server (apache2) interpretará las peticiones de HTTP y las traducirá a operaciones locales en el servidor. Con apache2 se pueden servir páginas estáticas en HTML, pero para crear la aplicación, claramente necesitaremos algo dinámico. Hay varias opciones pero se describirá una opción usando PHP.
  
 === Instalar PHP === === Instalar PHP ===
  
-PHP (PHP: Hypertext Preprocessor) es un lenguaje para crear scripts que se ejecutan en el servidor (al contrario de Javascript, por ejemplo, que se ejecuta normalmente en el cliente).+PHP (PHP: Hypertext Preprocessor) es un lenguaje para crear scripts que se ejecutan en el servidor (al contrario de Javascript, por ejemplo, que se ejecuta normalmente en el lado del cliente).
  
 Para instalar PHP con soporte para apache2 y postgres: Para instalar PHP con soporte para apache2 y postgres:
  
-<code>sudo apt-get install php7.libapache2-mod-php7.php7.3-pgsql</code>+<code>sudo apt-get install php7.libapache2-mod-php7.php7.4-pgsql</code>
  
 Ahora, tenemos que reiniciar Apache: Ahora, tenemos que reiniciar Apache:
Line 156: Line 143:
 ?> ?>
 </code> </code>
 +
 +... y guardar.
  
 Ir aquí para verificar que funcione: Ir aquí para verificar que funcione:
Line 234: Line 223:
 Si funciona, podrán adaptar el ejemplo para crear su aplicación. Hay [[http://phpdelusions.net/pdo|un tutorial aquí]] que puede ser útil. Si funciona, podrán adaptar el ejemplo para crear su aplicación. Hay [[http://phpdelusions.net/pdo|un tutorial aquí]] que puede ser útil.
  
-OJO: ¡Es importante usar métodos seguros contra inyección! Mi ejemplo es solo una prueba, no un ejemplo a seguir.+OJO: ¡Es importante usar métodos seguros contra inyección! El ejemplo acá es solo una prueba, no un ejemplo a seguir. HINT: Hay un ejemplo seguro indicado en el lab 5.
  
 === Debugear / Logs === === Debugear / Logs ===
Line 243: Line 232:
  
 Al final del archivo habrá los errores más recientes. Puedes usar la barra espaciadora para avanzar en el archivo. El error debería proveer más información para resolver el problema. Al final del archivo habrá los errores más recientes. Puedes usar la barra espaciadora para avanzar en el archivo. El error debería proveer más información para resolver el problema.
 +
 +Si el error no es de Apache2 + PHP, puede tratarse de Postgres. Para ver los logs hay que abrir:
 +
 +<code>sudo more /var/log/postgresql/postgresql-11-main.log</code>
 +
 +Y ver al final del archivo el posible error.
  
 ==== Opción 2: Django (Python) ==== ==== Opción 2: Django (Python) ====
Line 250: Line 245:
   * PRO: da una abstracción de todo en Python   * PRO: da una abstracción de todo en Python
   * CON: hay que programar en Python   * CON: hay que programar en Python
-  * CON: muy **muy** difícil de configurar inicialmente+  * CON: difícil de configurar inicialmente
   * CON: mucho más "pesado" e "indirecto" que PHP en particular   * CON: mucho más "pesado" e "indirecto" que PHP en particular
  
 La idea de Django es proveer una abstracción Modelo/Vista/Controlador de una aplicación Web en Python, donde el modelo captura los datos (p.ej. SQL) y la lógica (p.ej. python), la vista representa la información de salida que hay que desplegar para el usuario (p.ej. HTML), y el controlador acepta la entrada del usuario y la convierte en modificaciones al modelo (p.ej. para actualizar la base de datos desde una petición en HTML). La idea de Django es proveer una abstracción Modelo/Vista/Controlador de una aplicación Web en Python, donde el modelo captura los datos (p.ej. SQL) y la lógica (p.ej. python), la vista representa la información de salida que hay que desplegar para el usuario (p.ej. HTML), y el controlador acepta la entrada del usuario y la convierte en modificaciones al modelo (p.ej. para actualizar la base de datos desde una petición en HTML).
  
-A mi parecer, Django tiene un costo inicial muy alto, pero después uno tendrá una abstracción más limpia, la cual es útil, en particular, para aplicaciones complejas. Si ustedes quieren hacer algo más simple y rápido, PHP sería la mejora opción. Si ustedes quieren aprender algo de un framework usado bastante en la práctica, Django es una buena opción PERO aquí sólo se dará la información suficiente para instalar y configurar una aplicación básica. No será un tutorial completo (el enfoque del curso es bases de datos, no aplicaciones web). +Django tiene un costo inicial muy alto, pero después uno tendrá una abstracción más limpia, la cual es útil, en particular, para aplicaciones complejas. Si ustedes quieren hacer algo más simple y rápido, PHP sería la mejora opción. Si ustedes quieren aprender algo de un framework usado bastante en la práctica, Django es una buena opción PERO aquí sólo se dará la información suficiente para instalar y configurar una aplicación básica. No será un tutorial completo (el enfoque del curso es bases de datos, no aplicaciones web). Aquí puede encontrar más información útil: desde tutoriales hasta documentación: [[https://www.djangoproject.com/start/|Django docs]].
- +
-Aqui puede encontrar más información úti: desde tutoriales hasta documentación: [[https://www.djangoproject.com/start/|Django docs]].+
  
 === Instalar Python === === Instalar Python ===
Line 280: Line 273:
 === Instalar Django === === Instalar Django ===
  
-Usaremos PIP (un instalador para packages de Python) para instalar la versión más reciénte de Django para python3.+Usaremos PIP (un instalador para packages de Python) para instalar la versión más reciente de Django para python3.
  
 <code> <code>
Line 386: Line 379:
 </code> </code>
  
-(donde hay que reemplazar ''XX'' por el número del grupo)+(donde hay que reemplazar ''XX'' por el número de la máquina)
  
 Pero dará una excepción sobre: Pero dará una excepción sobre:
Line 487: Line 480:
 === Configurar archivos estáticos y templates === === Configurar archivos estáticos y templates ===
  
-Cuando se desarrolla una aplicación web se manejan recursos estáticos como logos, videos o archivos CSS los cuales se agregan directamente a los templates (o plantillas) HTML generados. En el caso de Django hay que señalarán donde estarán dichos recursos. Vamos a configurar una carpeta para los archivos estáticos y otra para los templates.+Cuando se desarrolla una aplicación web se manejan recursos estáticos como logos, videos o archivos CSS los cuales se agregan directamente a los templates (o plantillas) HTML generados. En el caso de Django hay que señalar donde estarán dichos recursos. Vamos a configurar una carpeta para los archivos estáticos y otra para los templates.
  
 Para empezar, hay que configurar el ''settings.py'' para encontrar archivos estáticos: Para empezar, hay que configurar el ''settings.py'' para encontrar archivos estáticos:
Line 1357: Line 1350:
 ==== Opción 4: Algo diferente ==== ==== Opción 4: Algo diferente ====
  
-Se puede usar otra opción para armar la aplicación:+Tienen sudo, así que pueden usar otra opción para armar la aplicación:
  
-  * JSPSpringStruts, Flask, Rails, Zend, etc.+  * FlaskReactAngular, Rails, Spring, etc.
  
 ... pero no podremos ofrecerles soporte si hay problemas. ... pero no podremos ofrecerles soporte si hay problemas.
 +
 +====== Conexión Externa =====
 +
 +Finalmente, se deben configurar los puertos de modo que la aplicación web quede disponible para acceder a través de una URL. Puede encontrar instrucciones de como hacerlo visitando [[proyecto:conexion_externa|este enlace]].
proyecto/armar_la_aplicacion_inicial.1650436054.txt.gz · Last modified: 2022/04/20 06:27 by ahogan