patrón MVC
MVC (Modelo-Vista-Controlador) es un patrón de diseño de software ampliamente utilizado para simplificar el proceso de desarrollo de aplicaciones. Hace que la estructura de la aplicación sea más clara al separar el acceso a los datos, la interfaz de usuario y la lógica empresarial.
Componentes de MVC
1. modelo
- Definición : Representa los datos y la lógica empresarial de una aplicación.
- Responsabilidades :
- Interactuar con la base de datos.
- Operaciones lógicas para procesar datos.
- Implementación en JavaWeb :
- Utilice la clase POJO (Plain Old Java Object), que generalmente corresponde a la tabla de la base de datos uno a uno.
- DAO (Objeto de acceso a datos) es responsable de la interacción con la base de datos.
- La capa de servicio implementa la lógica empresarial
- Los marcos ORM (Mapeo relacional de objetos) como Hibernate se pueden utilizar para simplificar las operaciones de la base de datos.
2. Ver
- Definición : Responsable de presentar los datos del modelo a los usuarios.
- Responsabilidades : Mostrar datos y proporcionar interfaz de usuario.
- Implementación en JavaWeb :
- JSP (páginas JavaServer) de uso común
- También puedes utilizar motores de plantillas modernos como Thymeleaf.
3. Controlador
- Definición : Manejar las solicitudes de los usuarios y coordinar modelos y vistas.
- Responsabilidades :
- recibir entrada del usuario
- Llame a la lógica de negocios del modelo.
- Vista de actualización
- Implementación en JavaWeb :
- Usando Servlets de forma tradicional
- Usando clases anotadas @Controller en el marco Spring
Objetos integrados JSP
JSP proporciona varios objetos integrados que simplifican enormemente el proceso de desarrollo web. La siguiente es una descripción general de los principales objetos integrados:
- solicitud (HttpServletRequest)
- Pasar la solicitud enviada por el cliente al servidor.
- Contiene parámetros, URL, información de encabezado, etc.
- respuesta (HttpServletResponse)
- Lleva la respuesta enviada por el servidor al cliente.
- Se pueden configurar encabezados de respuesta, códigos de estado, etc.
- contexto de página (Contexto de página)
- Proporciona acceso a otros objetos integrados.
- Contiene métodos para toda la página, como obtener, configurar y eliminar propiedades.
- sesión (HttpSession)
- Almacenar información de estado durante una sesión.
- aplicación (ServletContext)
- Comparta datos en toda la aplicación
- fuera (JspWriter)
- Enviar contenido HTML al cliente
- configuración (ServletConfig)
- Contiene parámetros para inicializar el servlet.
- página (Objeto)
- Representa el objeto Servlet actual.
- Excepción (lanzable)
- Sólo se utiliza en páginas de error (isErrorPage=true)
- Contiene información de excepción
Estos objetos integrados facilitan enormemente el procesamiento de solicitudes HTTP. Por ejemplo:
- Úselo
request
para obtener el contenido de la solicitud del usuario. session
Obtener información del estado de la sesión usandoout
Enviar HTML al cliente usando
Comparación de JSP y Servlet
JSP (JavaServer Pages) y Servlet son tecnologías comúnmente utilizadas en el desarrollo JavaWeb, utilizadas principalmente para generar contenido web dinámico. Aunque sus objetivos son similares, existen diferencias obvias en cómo se utilizan y en los escenarios aplicables.
1. Sintaxis y facilidad de uso
JSP
- Basado en HTML, que permite incrustar código Java en HTML
- La compatibilidad con Expression Language (EL) y JSTL simplifica el acceso a los datos y las operaciones comunes
- Más adecuado para generar y mostrar vistas (Ver)
Servlet
- Código Java puro
- Relativamente engorroso al generar HTML
- Más adecuado para manejar lógica empresarial compleja
2. Método de compilación
JSP
- Compilar en la primera solicitud
- Recompile automáticamente después de cambios de código, no es necesario reiniciar el servidor
Servlet
- Compilado al inicio del servidor o en la primera solicitud
- Después de compilar una vez, no es necesario volver a compilar. Los cambios de código requieren reiniciar el servidor.
3. Propósito principal
JSP
- Generar y mostrar vistas (páginas HTML)
- Adecuado para manejar lógica de visualización simple
Servlet
- Manejar la lógica empresarial
- Manejar operaciones de back-end como envío de formularios y consultas de bases de datos.
4. Aplicación en patrón MVC
En el desarrollo real, JSP y Servlet generalmente se usan juntos para implementar el patrón de diseño MVC (Modelo-Vista-Controlador):
- Controlador : Servlet procesa las solicitudes de los usuarios y ejecuta la lógica empresarial.
- Modelo : implementación de POJO (Plain Old Java Object), que almacena datos de la capa de aplicación
- Ver : JSP muestra datos a los usuarios
Esta combinación aprovecha al máximo las ventajas de ambos y mejora la capacidad de mantenimiento y escalabilidad del código.
Comparación de sesiones y cookies
Las sesiones y las cookies son tecnologías web importantes para almacenar información del usuario, pero difieren significativamente en varios aspectos.
1. Ubicación de almacenamiento
- Sesión : almacenada en el lado del servidor, cada usuario tiene una sesión única.
- Cookie : almacenada en el cliente (navegador), configurada a través del encabezado de respuesta HTTP.
2. Capacidad de almacenamiento
- Cookie : Pequeña capacidad, normalmente no más de 4 KB.
- Sesión : En teoría, no hay límite, pero demasiadas pueden ocupar mucha memoria del servidor.
3. tipo de datos
- Cookie : solo puede almacenar cadenas, es necesario codificar caracteres especiales.
- Sesión : puede almacenar cualquier tipo de datos (como cadenas, números, objetos, etc.).
4. Ciclo de vida
- Galleta :
- Se puede establecer un tiempo de vencimiento claro.
- Cuando no hay una configuración de tiempo de vencimiento, solo es válido en la sesión actual del navegador.
- Sesión :
- Controlado por el servidor, normalmente con un tiempo de caducidad establecido.
- El servidor podrá ser eliminado automáticamente cuando el usuario esté inactivo durante un largo período de tiempo.
5. Seguridad
- Cookie : almacenada en el lado del cliente, tiene baja seguridad y puede ser robada o modificada.
- Sesión : almacenada en el servidor, los usuarios no pueden acceder directamente a ella y la seguridad es alta.
6. Escenarios de aplicación
- Cookie : Adecuada para almacenar pequeñas cantidades de datos con bajos requisitos de seguridad.
- Sesión : Adecuado para almacenar grandes cantidades de datos con altos requisitos de seguridad.
7. Impacto en el rendimiento
- Cookie : incluida en cada solicitud HTTP, que puede afectar la eficiencia de transmisión de la red.
- Sesión : no afecta la transmisión de la red, pero puede aumentar la carga del servidor.
Seleccionar sugerencias
- Necesita almacenar una gran cantidad de datos y tiene altos requisitos de seguridad: use Session.
- Sólo es necesario almacenar una pequeña cantidad de datos y los requisitos de seguridad no son elevados: utilice cookies.
- Considere usarlos en combinación: las cookies almacenan la identificación de la sesión y la sesión almacena datos específicos.
Inicio de sesión único: soluciones cuando las cookies están deshabilitadas
El inicio de sesión único (SSO) es un método que permite a los usuarios acceder a múltiples sistemas o servicios relacionados a través de una sola autenticación. Tradicionalmente, SSO dependía de cookies para rastrear el estado de la sesión del usuario. Sin embargo, cuando las cookies están deshabilitadas, necesitamos adoptar alternativas. Aquí hay varias soluciones posibles, cada una con sus pros y sus contras:
1. Reescritura de URL
Principio: agregue el identificador de sesión (como SessionID) a la URL.
ventaja:
- Sencillo y fácil de implementar
- No depende del almacenamiento del lado del cliente
defecto:
- Riesgo de seguridad: el ID de sesión puede ser interceptado o filtrado
- Las URL se vuelven largas y antiestéticas
- Puede afectar el SEO
Escenario de uso: adecuado para sistemas internos con bajos requisitos de seguridad
2. Ocultar campos del formulario
Principio: agregue campos ocultos al formulario HTML para almacenar información de la sesión.
ventaja:
- Relativamente seguro y no expuesto directamente en la URL
- Sencillo de implementar
defecto:
- Se aplica solo a interacciones basadas en formularios
- No se pueden manejar solicitudes sin formulario (como AJAX)
Escenario de uso: adecuado para aplicaciones web tradicionales basadas en formularios
3. Almacenamiento web (almacenamiento local/almacenamiento de sesión)
Principio: utilice la API de almacenamiento web de HTML5 para almacenar información de la sesión en el cliente.
ventaja:
- Persistencia de datos (localStorage) o persistencia de sesión (sessionStorage)
- Mayor capacidad de almacenamiento
- No se envía automáticamente con la solicitud HTTP, la transmisión de datos se puede controlar
defecto:
- Requiere soporte de JavaScript
- Posibles riesgos de seguridad XSS
Escenarios de uso: adecuado para aplicaciones web modernas, especialmente aplicaciones de una sola página (SPA)
4. Autenticación basada en tokens (como JWT)
Principio: el servidor genera un token que contiene información de identidad del usuario y el cliente almacena e incluye el token en cada solicitud.
ventaja:
- Sin estado, fácil de expandir
- Buen soporte entre dominios
- Puede contener información rica del usuario.
- Alta seguridad (si se implementa correctamente)
defecto:
- La implementación es relativamente compleja
- La gestión de tokens (por ejemplo, actualizar, revocar) requiere consideraciones adicionales
Escenarios de uso: adecuado para aplicaciones web y API modernas que requieren alta seguridad y escalabilidad.
Seleccionar sugerencias
- Para aplicaciones con altos requisitos de seguridad, evite utilizar la reescritura de URL
- Si se trata de una aplicación moderna basada en HTML5, dé prioridad al almacenamiento web o al enfoque basado en tokens.
- Para sistemas que requieren un alto grado de seguridad y escalabilidad, se recomiendan métodos de autenticación basados en tokens como JWT.
- Siempre que sea posible, combine métodos para mejorar la compatibilidad y la seguridad.
Recuerde, independientemente del método que elija, tenga en cuenta la seguridad y siga las mejores prácticas durante la implementación.
Eliminación de sesión en aplicación web
En aplicaciones web, las sesiones pueden eliminarse debido a los siguientes factores:
1. Tiempo de espera de la sesión
La mayoría de los marcos permiten establecer tiempos de espera. Si una sesión específica no accede al servidor durante este tiempo, se eliminará automáticamente.
- Ejemplo : en Java Servlet, el tiempo de espera se puede configurar a través del
web.xml
archivo de configuración.<session-config>
2. Eliminación manual
El código de la aplicación puede eliminar sesiones explícitamente.
- Ejemplo : en Java Servlet, puede utilizar
HttpSession.invalidate()
un método para eliminar la sesión.
3. Reinicio del servidor
- Valor predeterminado : cuando el servidor se reinicia, se eliminan todas las sesiones en memoria.
- Excepción : algunos servidores pueden conservar sesiones en el disco y restaurarlas tras reinicios.
4. Cierra el navegador
- Para las sesiones basadas en cookies (la implementación más común), la cookie de sesión generalmente se elimina cuando se cierra el navegador.
- Esto no elimina inmediatamente la sesión en el lado del servidor a menos que se establezca un tiempo de espera de sesión o el servidor tome alguna medida.
5. Comportamiento específico del servidor
La gestión de sesiones la gestiona el servidor web y puede variar entre diferentes servidores:
- Algunos servidores realizan comprobaciones de tiempo de espera periódicamente y eliminan sesiones caducadas.
- Otros servidores pueden comprobar el tiempo de espera de la sesión al recibir solicitudes.
mejores practicas
- Establezca tiempos de espera adecuados según las necesidades de seguridad de su aplicación.
- Implemente la función de cierre de sesión manual para que el usuario pueda invalidar activamente la sesión después de completar la operación.
- Considere la posibilidad de utilizar cookies seguras de solo HTTP para almacenar ID de sesión para mejorar la seguridad.
- Comprenda la política de administración de sesiones para el servidor específico que está utilizando.
Nota: El comportamiento específico puede variar según el servidor web, el marco de la aplicación y los ajustes de configuración.
El proceso de creación de una instancia de Servlet en Tomcat.
Como contenedor web que implementa la especificación de Servlet, Tomcat es responsable de crear y gestionar el ciclo de vida de los objetos de Servlet. El siguiente es el proceso detallado de creación y administración de instancias de Servlet en Tomcat:
1. Cargue la clase Servlet
Cuando Tomcat recibe una solicitud y necesita crear una clase de servlet específica:
- Llame al cargador de clases (ClassLoader) para cargar la clase especificada
- Si la clase ya está cargada, omita este paso.
2. Crear una instancia de la clase Servlet
- Tomcat utiliza el mecanismo de reflexión de Java
Class.newInstance()
para crear una instancia de Servlet - Este método llama al constructor sin parámetros de la clase Servlet.
- Nota: Si la clase no tiene un constructor sin parámetros o el constructor es inaccesible (como privado), se generará una excepción.
3. Inicialice el objeto Servlet
- Tomcat llama
init(ServletConfig config)
al método de la instancia de Servlet - Pasar
ServletConfig
el objeto, incluidos los parámetros de inicialización. - Este paso permite al servlet realizar cualquier operación de configuración necesaria.
4. Procese la solicitud (llame al método de servicio)
- Una vez completada la inicialización, Tomcat llama al
service()
método Servlet para procesar la solicitud. service()
Los métodos suelen recibir dos parámetros:HttpServletRequest
Ejemplo: representa la solicitud del cliente.HttpServletResponse
Ejemplo: indica la respuesta del servidor
5. Gestión del ciclo de vida de los servlets.
- Las instancias de servlet suelen ser singleton y solo se crea una instancia de cada clase de servlet.
- En un entorno de subprocesos múltiples, cada solicitud de cliente es manejada por un subproceso separado
- Los desarrolladores deben garantizar la seguridad de los subprocesos de los servlets
6. Destrucción de servlets
- Cuando el servlet ya no es necesario o el servidor se apaga, Tomcat llama al
destroy()
método del servlet - Este método se utiliza para liberar recursos y realizar operaciones de limpieza.
Cosas a tener en cuenta
- Mecanismo de reflexión :
newInstance()
los métodos son parte de la API de reflexión de Java y permiten que los objetos se creen dinámicamente en tiempo de ejecución. - Seguridad de subprocesos : dado que Servlet es un singleton, se debe prestar especial atención a los problemas de seguridad de subprocesos en un entorno de subprocesos múltiples.
- Consideraciones de rendimiento : la función singleton de Servlet ayuda a mejorar el rendimiento, pero también plantea desafíos de seguridad de subprocesos.
- Manejo de errores : durante todo el proceso, Tomcat necesita manejar adecuadamente posibles excepciones, como fallas en la carga de clases, errores de creación de instancias, etc.
A través de este proceso, Tomcat puede administrar de manera flexible el ciclo de vida de Servlet y realizar las funciones principales del contenedor de Servlet.
Ataques de inyección SQL y sus medidas de prevención
La inyección SQL es una forma común y peligrosa de ataque a la red. Los atacantes intentan manipular las consultas de la base de datos insertando código SQL malicioso en la entrada del usuario para obtener información confidencial o alterar los datos. Para prevenir eficazmente los ataques de inyección SQL, se pueden tomar las siguientes medidas clave:
- Utilice declaraciones preparadas
- Principio: antes de ejecutar la instrucción SQL, determine la estructura de la consulta y luego pase los parámetros.
- Ventajas: los parámetros no se interpretarán como códigos SQL, lo que evitará eficazmente la inyección.
- Implementación: como en Java usando
PreparedStatement
clases.
- Utilice consultas parametrizadas
- Similar a las declaraciones preparadas, garantiza que la entrada del usuario se trate como datos en lugar de código.
- Aplicable a diversos lenguajes de programación y sistemas de bases de datos.
- Validación estricta de la entrada del usuario
- Filtrar y validar todas las entradas del usuario.
- Por ejemplo: restrinja los nombres de usuario a letras y números.
- Rechaza o escapa de personajes potencialmente peligrosos.
- Implementar el principio de privilegio mínimo.
- Controle estrictamente los permisos de acceso a la base de datos.
- Otorgue a los usuarios solo los permisos mínimos necesarios para completar las operaciones necesarias.
- Incluso si se produce una inyección, el daño potencial puede ser limitado.
Combinando estos métodos, el riesgo de ataques de inyección SQL se puede reducir significativamente. Cabe señalar que las medidas de seguridad deben tener varios niveles y no basarse únicamente en un único método de defensa. La concienciación continua sobre la seguridad y las revisiones periódicas del código son igualmente importantes para ayudar a identificar y corregir posibles vulnerabilidades de manera oportuna.
Introducción al ataque y defensa XSS
ataque XSS
XSS (cross-site scripting) es un método de ataque que inyecta scripts maliciosos en páginas web para que estos scripts puedan ejecutarse en los navegadores de otros usuarios. Cuando un usuario visita una página web que contiene scripts maliciosos, estos scripts se ejecutarán en el navegador del usuario para realizar operaciones maliciosas, como por ejemplo:
- Obtener información del usuario
- Manipulación del contenido web
- Realizar acciones no autorizadas
Formas de prevenir XSS
- Escapar de la entrada del usuario : escape de todos los datos proporcionados por el usuario para garantizar que el navegador los analice como texto sin formato y no los ejecute como un script.
- Política de seguridad de contenido (CSP) : CSP es un mecanismo de seguridad del navegador que puede restringir eficazmente la ejecución y carga de los recursos del navegador. Por ejemplo, restringir las páginas web para que solo ejecuten y carguen scripts desde el mismo nombre de dominio puede prevenir eficazmente XSS.
- Verificación de entrada : Verifique la información enviada por el usuario y rechace procesarla cuando se descubra que contiene contenido que pueda causar inyección XSS.
- Utilice cookies de solo HTTP : utilice el indicador de solo HTTP para modificar las cookies que contienen información confidencial para evitar que JavaScript obtenga o modifique el contenido de las cookies.
- Evite el uso de código JS no seguro : algunos métodos JS (como InnerHTML) tienen riesgos de seguridad y deben evitarse tanto como sea posible.
Para defenderse eficazmente contra los ataques XSS, es mejor utilizar una combinación de los métodos anteriores para crear un mecanismo de defensa multicapa. Las auditorías y actualizaciones de seguridad periódicas también son medidas importantes para mantener seguro su sitio web.
CSRF
CSRF (falsificación de solicitudes entre sitios) es un ataque de seguridad de red que explota la identidad autenticada de un usuario en un sitio web confiable para realizar acciones no autorizadas. El proceso de ataque es el siguiente:
- El atacante construye un sitio web o un enlace malicioso.
- Inducir al usuario objetivo a hacer clic en el enlace o visitar un sitio web malicioso.
- Si el usuario actualmente ha iniciado sesión en el sitio web de destino, su información de autenticación de identidad (como cookies) se enviará automáticamente con la solicitud.
- El atacante utiliza esta información de autenticación para enviar solicitudes falsificadas al sitio web de destino como usuario.
- El sitio web de destino no puede saber si estas solicitudes son iniciadas por usuarios reales y, por lo tanto, realizan operaciones no autorizadas.
El peligro de un ataque CSRF es que puede eludir la autenticación de identidad y realizar diversas operaciones sin el conocimiento del usuario, como modificar la información de la cuenta, realizar transacciones, etc. Para evitar ataques CSRF, los sitios web deben implementar medidas de seguridad adicionales, como el uso de tokens anti-CSRF, la verificación de los encabezados Referer, etc.