Cómo convertirse en dev backend: fundamentos de Web Security

Cómo convertirse en dev backend: fundamentos de Web Security

El desarrollo backend es un área de programación que implica crear y mantener la parte lógica y funcional de un sitio web o aplicación web como la base de datos, API, servidor e integración con otros servicios. Un desarrollador backend es responsable de garantizar que los datos se almacenen, procesen y transmitan de forma segura, eficiente y confiable entre el frontend (la interfaz gráfica que el usuario ve e interactúa) y el backend.

Uno de los aspectos más importantes y desafiantes del desarrollo backend es la seguridad web, es decir, el conjunto de prácticas y técnicas que tienen como objetivo proteger los datos y recursos de un sitio web o aplicación web contra ataques maliciosos como invasión, robo, alteración, servicio de negación, entre otros. La seguridad web es fundamental para garantizar la privacidad, integridad y disponibilidad de los datos de usuarios y clientes, así como para evitar pérdidas financieras, legales y reputacionales a desarrolladores y empresas.

En este artículo, cubriremos algunos de los fundamentos de seguridad web que todo desarrollador backend debería conocer y aplicar en sus proyectos. Veremos cuáles son las principales amenazas y vulnerabilidades que afectan a los sitios web y aplicaciones web, cómo prevenirlas y mitigarlas, y cuáles son las mejores prácticas y herramientas para implementar una seguridad web eficaz. También mostraremos algunos ejemplos de código que ilustran los conceptos discutidos en el artículo.


Principales amenazas y vulnerabilidades

Las amenazas y vulnerabilidades que afectan a los sitios web y aplicaciones web son diversas y varían según el tipo, complejidad y propósito del proyecto. Sin embargo, existen algunas categorías generales que pueden considerarse las más comunes y peligrosas:

  • Injección: es un tipo de ataque que consiste en insertar código malicioso o comandos no deseados en un sitio web o aplicación web, a través de entradas proporcionadas por el usuario u otros medios. El objetivo es ejecutar este código o comando en el contexto del sitio web o aplicación web, lo que podría comprometer su funcionamiento, acceder o modificar datos sensibles, o realizar otras acciones maliciosas. Un ejemplo clásico de inyección es la inyección SQL, en la que el atacante inserta una consulta SQL maliciosa en un campo de entrada de datos (como un formulario o una URL), que se envía a la base de datos del sitio web o de la aplicación web, pudiendo leer, cambiar. o eliminar datos, o incluso ejecutar comandos arbitrarios en el servidor. Otros ejemplos de inyección son Command Injection, Code Injection, LDAP Injection, XPath Injection, entre otros.
  • Violación de autenticación: es un tipo de ataque que tiene como objetivo obtener acceso no autorizado a un sitio web o aplicación web mediante la explotación de fallas en los mecanismos de autenticación (el proceso que verifica la identidad del usuario) o la gestión de sesiones (el proceso que mantiene el estado del nombre de usuario después de la autenticación). El objetivo es asumir la identidad de un usuario legítimo u obtener privilegios elevados en el sitio web o aplicación web, pudiendo acceder o modificar datos restringidos, o realizar otras acciones maliciosas. Algunos ejemplos de violaciones de autenticación son el ataque de fuerza bruta (en el que el atacante intenta adivinar las credenciales del usuario mediante intentos repetidos), el secuestro de sesión (en el que el atacante captura o manipula el identificador de sesión del usuario), la fijación de sesión (en el que el atacante fuerza la usuario utilice un identificador de sesión predefinido por el atacante), entre otros.
  • Exposición de datos sensibles: es un tipo de ataque que tiene como objetivo obtener acceso no autorizado a datos confidenciales almacenados o transmitidos por un sitio web o aplicación web, mediante la explotación de fallas en los mecanismos de cifrado (el proceso que transforma los datos en un formato ilegible para cualquiera que no tenga la clave ) o protección de datos (el proceso que restringe el acceso a los datos según el nivel de autorización). El objetivo es leer, copiar o divulgar estos datos, lo que puede causar daños a la privacidad, integridad y confidencialidad de los usuarios y clientes, así como pérdidas financieras, legales y reputacionales para desarrolladores y empresas. Algunos ejemplos de exposición de datos confidenciales son el ataque Man-in-the-Middle (en el que el atacante intercepta y modifica los datos transmitidos entre el usuario y el sitio web o la aplicación web), la violación de datos (en la que el atacante obtiene acceso a los datos almacenados en el servidor o base de datos del sitio web o aplicación web), Weak Encryption (en el que el atacante logra romper el cifrado utilizado para proteger los datos), entre otros.
  • Cross-Site Scripting (XSS): es un tipo de ataque que consiste en insertar código malicioso o comandos no deseados en un sitio web o aplicación web, a través de entradas proporcionadas por el usuario u otros medios. El objetivo es ejecutar este código o comando en el navegador del usuario, que podría comprometer su experiencia, acceder o modificar datos sensibles, o realizar otras acciones maliciosas. Un ejemplo típico de XSS es Reflected XSS, donde el atacante envía una URL maliciosa al usuario (por ejemplo, por correo electrónico o redes sociales), que contiene un código o comando inyectado en un parámetro de la URL. Cuando el usuario hace clic en la URL, el código o comando se refleja en el sitio web o la aplicación web y se ejecuta en el navegador del usuario. Otros ejemplos de XSS son el XSS almacenado (en el que el código o comando inyectado se almacena en el servidor o base de datos del sitio web o aplicación web y se ejecuta cada vez que el usuario accede a una página específica) y el código o comando inyectado basado en el modelo de objetos de documento (DOM) en el navegador del usuario manipulando el DOM de la página.
  • Cross-Site Request Forgery (CSRF): es un tipo de ataque que consiste en inducir al usuario a realizar una acción no deseada en un sitio web o aplicación web explorando la confianza que el sitio web o aplicación web tiene en la sesión del usuario. El objetivo es conseguir que el usuario realice una solicitud HTTP falsificada al sitio web o aplicación web y pueda cambiar sus datos, preferencias, permisos o realizar otras acciones maliciosas. Un ejemplo común de CSRF es el siguiente: el usuario inicia sesión en el sitio de un banco en línea y recibe un correo electrónico con un enlace a un sitio malicioso. Al hacer clic en el enlace, el usuario es llevado a una página que contiene una imagen oculta con un atributo SRC que apunta a la URL de un banco en línea, con un parámetro que indica una transferencia bancaria a la cuenta del atacante. Como el usuario inicia sesión en el sitio bancario en línea, la solicitud HTTP forjada se envía con su identificador de sesión y la transferencia bancaria se realiza sin su consentimiento.

Como prevenir y mitigar amenazas y vulnerabilidades

Para prevenir y mitigar las amenazas y vulnerabilidades descritas anteriormente, existen algunas medidas generales y específicas que todo desarrollador backend debería adoptar en sus proyectos en 2023. Veamos algunas de ellas:

  • Validar las entradas de datos: consiste en verificar si los datos proporcionados por el usuario o por otro medio son válidos, completos y coherentes con las reglas de negocio del sitio web o aplicación web. El objetivo es evitar que se envíen datos no válidos, incompletos o inconsistentes al backend, lo que podría provocar errores, fallas o vulnerabilidades. La validación de los ingresos de datos debe realizarse tanto en el frontend como en el backend, utilizando técnicas como filtros, sanitización, codificación, escape, entre otras. Por ejemplo, para evitar inyecciones de SQL, se recomienda utilizar consultas parametrizadas en lugar de concatenar cadenas directamente en la consulta SQL. Aquí un ejemplo en Python:

# Exemplo de consulta SQL vulnerável a injeção
username = input("Enter your username: ")
password = input("Enter your password: ")
query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"
result = db.execute(query)

Este código es vulnerable a la inyección porque concatena la entrada del usuario directamente en la consulta SQL, sin validar, filtrar ni escapar de los caracteres especiales que se pueden usar para cambiar la lógica de la consulta. Por ejemplo, si el usuario ingresa ' OR 1 = 1 -- como nombre de usuario y cualquier cosa como contraseña, la consulta SQL resultante será:

SELECT * FROM users WHERE username = '' OR 1 = 1 --' AND password = 'qualquer coisa'


Esta consulta SQL devolverá todos los registros de la tabla de usuarios, ya que la condición 1 = 1 siempre es verdadera y el comentario -- ignora el resto de la consulta. De esta manera, el atacante puede acceder al sitio web o a la aplicación web sin conocer las credenciales válidas de ningún usuario.

Ejemplo de consulta SQL protegida contra inyección

username = input("Enter your username: "

password = input("Enter your password: "

query = "SELECT * FROM users WHERE username = ? AND password = ?" result = db.execute(query, (username, password))

  • Fortalecer la autenticación y la administración de sesión: consiste en implementar mecanismos robustos y seguros para verificar la identidad del usuario y mantener su estado luego de la autenticación. El objetivo es evitar que usuarios no autorizados o malintencionados obtengan acceso o privilegios indebidos al sitio web o la aplicación web. Algunas buenas prácticas para fortalecer la autenticación y gestión de sesiones son: utilizar protocolos seguros como HTTPS, SSL/TLS, OAuth, entre otros; utilizar algoritmos hash y salt para almacenar contraseñas de usuario; utilizar mecanismos de verificación de dos pasos o de múltiples factores; utilizar identificadores de sesión aleatorios, únicos y de corta duración; invalidar los identificadores de sesión al cerrar sesión o después de un período de inactividad; limitar el número de intentos de inicio de sesión; entre otras. Por ejemplo, para generar un identificador de sesión seguro en Python, puedes usar la biblioteca secrets:

# Exemplo de geração de um identificador de sessão seguro
import secrets
session_id = secrets.token_urlsafe(32)


  • Criptografiar y proteger los datos sensibles: consiste en transformar datos sensibles en un formato ilegible para cualquiera que no tenga la clave y restringir el acceso a los datos según el nivel de autorización. El objetivo es evitar que atacantes o terceros no autorizados expongan, copien o divulguen datos confidenciales. Algunas buenas prácticas para cifrar y proteger datos sensibles son: utilizar algoritmos de cifrado sólidos y actualizados, como AES, RSA, SHA, entre otros; utilizar claves suficientemente largas y aleatorias; almacenar claves en ubicaciones seguras separadas de los datos; utilizar certificados digitales confiables; utilizar protocolos seguros como HTTPS, SSL/TLS, VPN, entre otros; aplicar el principio de privilegio mínimo, es decir, otorgar solo el acceso necesario a los datos para cada usuario o rol; entre otras. Por ejemplo, para cifrar datos confidenciales en Python, puede utilizar la biblioteca de criptografía:

# Exemplo de criptografia de um dado sensível
from cryptography.fernet import Fernet
key = Fernet.generate_key() # Gerar uma chave aleatória
f = Fernet(key) # Criar um objeto Fernet com a chave
data = b"Hello World" # Dado sensível a ser criptografado
encrypted_data = f.encrypt(data) # Criptografar o dado com a chave


  • Prevenir XSS: consiste en evitar que se inserten y ejecuten códigos maliciosos o comandos no deseados en el navegador del usuario. El objetivo es evitar que el usuario vea comprometida su experiencia, que se acceda o modifique sus datos u otras acciones maliciosas llevadas a cabo por atacantes. Algunas buenas prácticas para prevenir XSS son: validar el ingreso de datos proporcionados por el usuario o por otros medios; codificar o escapar de caracteres especiales que el navegador puede interpretar como código; utilizar encabezados HTTP como Content-Type, X-Frame-Options, Content-Security-Policy, entre otros; utilizar librerías o frameworks que ofrezcan protección contra XSS como React, Angular, Django, entre otros. Por ejemplo, para escapar de caracteres especiales en Python, puedes usar la biblioteca html:

# Exemplo de escape dos caracteres especiais
import html
data = "<script>alert('XSS')</script>" # Dado fornecido pelo usuário que contém código malicioso
escaped_data = html.escape(data) # Escapar os caracteres especiais
print(escaped_data) # &lt;script&gt;alert(&#x27;XSS&#x27;)&lt;/script&gt;


  • Prevenir CSRF: consiste en evitar que el usuario realice una acción no deseada en un sitio o aplicación web, explotando la confianza que el sitio web o aplicación web tiene en la sesión del usuario. El objetivo es evitar que el usuario envíe una solicitud HTTP falsificada al sitio web o aplicación web, cambie sus datos, preferencias, permisos o realice otras acciones maliciosas. Algunas buenas prácticas para prevenir CSRF son: usar tokens CSRF, es decir, valores aleatorios y únicos que son generados por el sitio web o aplicación web y enviados al usuario junto con el formulario o solicitud HTTP, y que deben ser devueltos por el usuario en la respuesta, para verificar el origen y autenticidad de la solicitud; utilizar encabezados HTTP como Origin, Referer, X-Requested-With, entre otros; utilizar mecanismos de verificación de dos pasos o de múltiples factores; entre otras. Por ejemplo, para usar tokens CSRF en Python, puedes usar la biblioteca Flask-WTF:

# Exemplo de uso de tokens CSRF
from flask import Flask, render_template
from flask_wtf import FlaskForm
from flask_wtf.csrf import CSRFProtect

app = Flask(__name__)
app.config["SECRET_KEY"] = "secret" # Definir uma chave secreta para gerar os tokens CSRF
csrf = CSRFProtect(app) # Criar um objeto CSRFProtect com a aplicação

class TransferForm(FlaskForm): # Criar um formulário de transferência bancária
    amount = IntegerField("Amount") # Campo para o valor da transferência
    account = StringField("Account") # Campo para a conta de destino
    submit = SubmitField("Transfer") # Botão para enviar o formulário

@app.route("/", methods=["GET", "POST"])
def index():
    form = TransferForm() # Criar uma instância do formulário
    if form.validate_on_submit(): # Se o formulário for válido (incluindo o token CSRF)
        amount = form.amount.data # Obter o valor da transferência
        account = form.account.data # Obter a conta de destino
        # Realizar a transferência bancária ...
        return "Transfer successful" # Retornar uma mensagem de sucesso
    return render_template("index.html", form=form) # Renderizar o template do formulário

Conclusión

En este artículo, vimos algunos de los fundamentos de seguridad web que todo desarrollador backend debería conocer y aplicar en sus proyectos. Vimos cuáles son las principales amenazas y vulnerabilidades que afectan a los sitios web y aplicaciones web, cómo prevenirlas y mitigarlas, y ¿cuáles son las mejores prácticas y herramientas para implementar una seguridad web eficaz? También mostramos algunos ejemplos de código que ilustran los conceptos tratados en el artículo.

La seguridad web es un tema amplio y complejo que requiere actualización y aprendizaje constante. No existe una solución única ni definitiva para garantizar la seguridad web de un sitio web o aplicación web, sino un conjunto de medidas complementarias y adaptables a las necesidades y riesgos de cada proyecto. Por lo tanto, es importante que los desarrolladores backend estén siempre al tanto de las novedades y tendencias del área, así como de las recomendaciones y estándares establecidos por organizaciones y comunidades especializadas.

Espero que este artículo haya sido útil e informativo. Si te gustó este artículo, compártelo con tus amigos y colegas.

¡Gracias por tu lectura!

Referencias Bibliográficas

  • OWASP. OWASP Top 10 - 2021. Disponível em: https://owasp.org/Top10/
  • MDN Web Docs. Web security. Disponível em: https://developer.mozilla.org/en-US/docs/Web/Security
  • W3Schools. Web Security Tutorial. Disponível em: https://www.w3schools.com/websecurity/default.asp
  • Python Software Foundation. Python Documentation. Disponível em: https://docs.python.org/3/
  • Pallets Projects. Flask Documentation. Disponível em: https://flask.palletsprojects.com/en/2.0.x/

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.