‫Entonces, todo lo que hicimos en esta sección hasta
‫ahora fue proteger todas las aplicaciones
‫y los datos de nuestros usuarios de la mejor manera posible.
‫Y hablé de muchas cosas que
‫podemos hacer para lograrlo.
‫Pero toda esta información
‫se esparció por todas estas conferencias.
‫Así que decidí crear este resumen rápido
‫con muchas de las mejores prácticas que ya implementamos y
‫que aún vamos a implementar en
‫el resto de esta sección.
‫Porque la seguridad es extremadamente importante,
‫pero desafortunadamente, muchos cursos no lo abordan lo suficiente.
‫Ahora, tampoco voy
‫a convertir este Node. js en un curso de seguridad.
‫Hay mejores cursos y expertos para eso.
‫Pero le mostraré un par
‫de cosas que puede hacer para proteger adecuadamente sus aplicaciones y datos.
‫Y voy a ver un par de
‫ataques comunes y dar algunas sugerencias para prevenirlos.
‫Y primero, tenemos el caso de una base de datos comprometida,
‫lo que significa que un atacante obtuvo acceso a nuestra base de datos.
‫Por supuesto, este es un problema extremadamente grave, pero
‫para evitar problemas aún mayores, siempre
‫debemos cifrar las contraseñas y los tokens de restablecimiento de contraseñas tal
‫como lo hicimos en los videos de esta sección.
‫De esta manera, el atacante no
‫puede al menos robar las contraseñas de nuestros usuarios y tampoco puede restablecerlas.
‫Ahora, sobre la prevención real de
‫los ataques, hablemos del ataque de
‫fuerza bruta en el que el atacante básicamente intenta
‫adivinar una contraseña probando millones y millones de contraseñas
‫aleatorias hasta encontrar la correcta.
‫Y lo que podemos hacer es hacer que la solicitud de inicio de sesión sea realmente lenta.
‫Y el paquete bcrypt que
‫estamos usando en realidad hace precisamente eso.
‫Otra estrategia es implementar la limitación de velocidad,
‫que limita la cantidad de
‫solicitudes provenientes de una única IP.
‫Y este lo implementaremos
‫en uno de los próximos videos.
‫Además, una buena estrategia es implementar un número
‫máximo de intentos de inicio de sesión para cada usuario.
‫Por ejemplo, podríamos hacer que
‫después de 10 intentos fallidos, el usuario tenga
‫que esperar una hora hasta que pueda volver a intentarlo.
‫Ahora bien, no voy a implementar
‫esta funcionalidad en esta sección, pero siéntase
‫libre de experimentar con ella por su cuenta.
‫Probablemente sea una experiencia de aprendizaje realmente genial codificar
‫esto usted mismo, y en
‫realidad no es tan difícil.
‫Está bien.
‫A continuación, está el ataque de secuencias de comandos entre sitios,
‫en el que el
‫atacante intenta inyectar secuencias de comandos en nuestra página para ejecutar su código malicioso.
‫Por el lado de los clientes, esto es
‫especialmente peligroso porque permite al atacante leer el almacenamiento local,
‫razón por la cual
‫nunca deberíamos almacenar el token web JSON en el almacenamiento local.
‫En su lugar, debe almacenarse en una cookie solo HTTP que lo haga
‫de modo que el navegador
‫solo pueda recibir y enviar la cookie,
‫pero no pueda acceder a ella ni modificarla de ninguna manera.
‫Y entonces, eso hace que sea imposible para
‫cualquier atacante robar el token web JSON que está almacenado en la cookie.
‫Nuevamente, implementaremos esto en un segundo.
‫Ahora, en el lado del backend, para evitar ataques XSS, debemos desinfectar
‫los datos de entrada del usuario
‫y establecer algunos encabezados HTTP especiales que
‫hacen que estos ataques sean un poco más difíciles de suceder.
‫Y Express no viene con estas mejores prácticas
‫listas para usar, por lo que usaremos middleware
‫para configurar todos estos encabezados especiales.
‫A continuación, tenemos los ataques de denegación de servicio.
‫Y tal vez hayas oído hablar de estos.
‫Ocurre cuando el atacante
‫envía tantas solicitudes a un servidor que se daña
‫y la aplicación deja de estar disponible.
‫Nuevamente, implementar la limitación de
‫velocidad es una buena solución para esto.
‫Además, debemos limitar la cantidad de datos que
‫se pueden enviar en un cuerpo en una publicación o una solicitud de parche.
‫Y también, debemos evitar el uso
‫de las llamadas expresiones regulares malvadas para estar en nuestro código.
‫Y estas son solo expresiones regulares
‫que toman un tiempo exponencial para ejecutarse para entradas que
‫no coinciden y pueden explotarse para hacer caer toda nuestra aplicación.
‫Bien, a continuación, tenemos el ataque de inyección de consultas NoSQL.
‫Y la inyección de consultas ocurre cuando
‫un atacante, en lugar de ingresar datos válidos, inyecta alguna
‫consulta para crear expresiones de
‫consulta que se traducirán en verdaderas.
‫Por ejemplo, iniciar sesión incluso
‫sin proporcionar un nombre de usuario o contraseña válidos.
‫Es un poco complejo
‫y definitivamente deberías buscarlo en Google para obtener más información.
‫Pero lo que necesita saber es que usar Mongoose
‫es en realidad una estrategia
‫bastante buena para prevenir este tipo de ataques
‫porque un buen esquema obliga a cada valor a
‫tener una pestaña de datos bien definida.
‫Lo que hace que
‫este tipo de ataque sea muy difícil de ejecutar.
‫Sin embargo, siempre es una buena
‫idea desinfectar los datos de entrada, solo para estar seguro.
‫Y nos ocuparemos de eso un poco más tarde.
‫Muy bien, y ahora
‫para terminar, solo tengo un par de mejores
‫prácticas y sugerencias sobre cómo
‫mejorar los mecanismos de autenticación y autorización que implementamos.
‫Entonces, lo primero que
‫necesito repetir una y otra vez
‫es que en una aplicación de producción,
‫toda la comunicación entre el servidor y el
‫cliente debe realizarse a través de HTTPS.
‫De lo contrario, cualquiera puede escuchar la conversación
‫y robar nuestro token web JSON.
‫A continuación, cree siempre tokens de contraseña aleatorios.
‫No generado a partir de fechas o algo así.
‫Debido a que son efectivamente contraseñas
‫y, por lo tanto, deben tratarse como tales.
‫Además, siempre déles fechas de vencimiento,
‫tal como lo implementamos.
‫¿Está bien?
‫Y también implementamos que un determinado token web JSON
‫ya no es válido después de que el usuario haya cambiado su contraseña.
‫Entonces, básicamente revocamos el token
‫tan pronto como el usuario cambia la contraseña.
‫Lo que tiene mucho sentido,
‫pero de nuevo, muchos tutoriales simplemente no hacen eso.
‫Otra gran cosa es nunca enviar un archivo
‫de configuración, como para las variables de entorno, a un
‫control de versión como Git.
‫De hecho, no lo subas a ningún
‫lado porque este archivo
‫contiene los datos más sensibles de toda la aplicación.
‫Por ejemplo, si alguien obtiene acceso a
‫su secreto de token
‫web JSON, todo su proceso de autenticación se verá comprometido.
‫De acuerdo, y ahora solo un pequeño detalle es que
‫cuando haya un
‫error, no envíe el error completo al cliente.
‫Por lo tanto, cosas como el seguimiento de la pila
‫podrían brindarle al atacante información valiosa sobre su
‫sistema y, por supuesto, no queremos eso.
‫A continuación, podemos usar el paquete csurf para
‫combatir un tipo de ataque llamado Cross-Site Request Forgery, que es un ataque
‫que obliga a un usuario a
‫ejecutar acciones no deseadas en una aplicación web en la
‫que está conectado actualmente.
‫Sin embargo, no haremos eso en esta sección.
‫Pero todavía quería mencionarlo aquí.
‫A continuación, podríamos requerir que el
‫usuario se vuelva a autenticar antes de realizar una acción de alto valor.
‫Por ejemplo, realizar un pago o eliminar algo.
‫Nuevamente, esta es solo una sugerencia que
‫puede probar usted mismo.
‫Otra característica interesante que puede implementar es una
‫lista negra de tokens que no son de confianza.
‫Entonces, ya sabemos que realmente no
‫existe una manera de cerrar la sesión de los usuarios de
‫la aplicación si muestran alguna actividad maliciosa.
‫Pero lo que podemos hacer es crear una lista de tokens no
‫confiables que luego se validan en cada solicitud.
‫Y a continuación, una función que podríamos haber implementado es confirmar la
‫dirección de correo electrónico después de que se crea una cuenta por primera vez.
‫Entonces, básicamente enviando un enlace al correo electrónico
‫del usuario, como lo hacen muchas aplicaciones reales.
‫Pero quería mantener las cosas simples aquí,
‫por eso no hice esto aquí.
‫Pero siéntase libre de implementarlo usted
‫mismo si lo desea.
‫Ahora, una gran característica que tienen muchas
‫aplicaciones es el concepto de tokens de actualización.
‫Que son básicamente para recordar a los usuarios.
‫Por lo tanto, para mantenerlos conectados
‫para siempre o hasta que decidan cerrar la sesión.
‫Nuestra implementación actual hace que
‫el usuario tenga que iniciar sesión nuevamente después
‫de que expire el token web JSON.
‫Pero, con los tokens de actualización, eso ya no es necesario.
‫Y es un poco complejo de implementar, por lo que
‫es una característica para otro momento.
‫Y finalmente, el último que
‫pudimos haber implementado es la autenticación de dos factores, con la
‫que estoy seguro de que está familiarizado.
‫Básicamente, con la autenticación de dos
‫factores, después de iniciar sesión en la
‫aplicación, el usuario
‫debe realizar una segunda acción para autenticarse realmente.
‫Y, por lo general, se trata de insertar
‫un código enviado por mensaje de texto a un teléfono móvil.
‫Entonces, estas son muchas funcionalidades que
‫nuestra autenticación podría tener.
‫Y si desea que implemente alguno de
‫ellos, hágamelo saber en la sección de preguntas y respuestas.
‫Y, si hay mucha demanda de uno de
‫ellos, le mostraré cómo funciona.
‫De acuerdo, pero de nuevo, no quería convertir
‫este Node. js en
‫un curso completo de seguridad y autenticación.
‫Y para terminar, algo que implementaremos en el resto
‫del apartado es evitar
‫la contaminación de los parámetros.
‫Por ejemplo, intente simplemente insertar dos parámetros de campo en la
‫cadena de consulta que busca todos los recorridos.
‫Y si lo hace, encontrará que habrá
‫un error porque
‫nuestra aplicación no está preparada para eso.
‫Y así, los atacantes intentan utilizar este tipo de debilidades para
‫bloquear aplicaciones, lo que, por supuesto, no es bueno.
‫Y entonces, tenemos que arreglar eso.
‫Bien, esto resultó ser mucho más largo de lo que esperaba.
‫Y hay cursos completos sobre seguridad si
‫realmente te gusta la seguridad.
‫Está bien, pero lo dejo
‫así, así que pasemos a la siguiente.