Desarrollo seguro de aplicaciones web con Flask

Beginner

This tutorial is from open-source community. Access the source code

Introducción

En este laboratorio, exploraremos importantes consideraciones de seguridad al desarrollar aplicaciones web con Flask. Cubriremos temas como Cross-Site Scripting (XSS), Cross-Site Request Forgery (CSRF), seguridad de JSON, encabezados de seguridad y opciones de cookies seguros. Siguiendo estos pasos, aprenderá a mejorar la seguridad de sus aplicaciones Flask.

Nota: Debe crear el archivo de código por sí mismo y ejecutarlo en el entorno. Puede previsualizar el estado del servicio Flask en Web 5000.

Cross-Site Scripting (XSS)

Cross-Site Scripting (XSS) es una vulnerabilidad que permite a los atacantes inyectar scripts maliciosos en las páginas web vistas por los usuarios. Para prevenir ataques XSS en Flask, siga estas pautas:

  • Siempre escapen el texto para evitar la inclusión de etiquetas HTML arbitrarias.
  • Tenga cuidado al generar HTML sin la ayuda de plantillas Jinja2.
  • Utilice la clase Markup para escapar los datos enviados por el usuario.
  • Evite enviar archivos HTML o de texto a partir de archivos cargados.

Código de ejemplo:

## app.py

from flask import Flask, render_template_string, Markup

app = Flask(__name__)

@app.route('/')
def index():
    value = '<script>alert("XSS Attack")</script>'
    safe_value = Markup.escape(value)
    return render_template_string('<input value="{{ value }}">', value=safe_value)

Para ejecutar el código, guárdelo en un archivo llamado app.py y ejecute el comando flask run.

Cross-Site Request Forgery (CSRF)

Cross-Site Request Forgery (CSRF) es un ataque que engaña a los usuarios para que realicen acciones no intencionadas en un sitio web. Para prevenir ataques CSRF en Flask, siga estas pautas:

  • Utilice tokens de un solo uso para validar las solicitudes que modifican el contenido del servidor.
  • Almacene el token en la cookie y transmítalo con los datos del formulario.
  • Compare el token recibido en el servidor con el almacenado en la cookie.

Código de ejemplo:

## app.py

from flask import Flask, request, session, redirect, url_for

app = Flask(__name__)
app.secret_key = 'clave_secreta'

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/delete', methods=['POST'])
def delete_user():
    if request.method == 'POST':
        token = request.form.get('token')
        if token and token == session.get('csrf_token'):
            ## Eliminar perfil de usuario
            return redirect(url_for('index'))
    return 'Solicitud no válida'

if __name__ == '__main__':
    app.run()

Para ejecutar el código, guárdelo en un archivo llamado app.py y ejecute el comando flask run.

Seguridad de JSON

En Flask, es importante garantizar la seguridad de las respuestas JSON. En versiones anteriores a la 0.10 de Flask, los arrays de nivel superior no se serializaban a JSON debido a una vulnerabilidad de seguridad. Sin embargo, este comportamiento ha cambiado y ahora los arrays de nivel superior se serializan. Se recomienda utilizar la última versión de Flask para aprovechar esta mejora de seguridad.

Encabezados de seguridad

Los navegadores reconocen varios encabezados de respuesta para controlar la seguridad. Se recomienda revisar y utilizar los siguientes encabezados de seguridad en su aplicación Flask:

  • HTTP Strict Transport Security (HSTS): Indica al navegador que convierta todas las solicitudes HTTP a HTTPS.
  • Content Security Policy (CSP): Especifica de dónde se pueden cargar varios tipos de recursos.
  • X-Content-Type-Options: Fuerza al navegador a respetar el tipo de contenido de la respuesta.
  • X-Frame-Options: Evita que sitios externos embeban su sitio en un iframe.

Puede utilizar la extensión Flask-Talisman para administrar HTTPS y encabezados de seguridad en su aplicación Flask.

Al configurar cookies en Flask, es importante considerar opciones de seguridad para proteger datos sensibles. Algunas opciones recomendadas son:

  • Secure: Limita las cookies solo al tráfico HTTPS.
  • HttpOnly: Protege el contenido de las cookies para que no se pueda leer con JavaScript.
  • SameSite: Restringe cómo se envían las cookies con solicitudes de sitios externos.

Código de ejemplo:

## app.py

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def index():
    response = make_response('Hello, world!')
    response.set_cookie('username', 'flask', secure=True, httponly=True, samesite='Lax')
    return response

if __name__ == '__main__':
    app.run()

Para ejecutar el código, guárdelo en un archivo llamado app.py y ejecute el comando flask run.

HTTP Public Key Pinning (HPKP)

HTTP Public Key Pinning (HPKP) es una característica de seguridad que indica al navegador que se autentique con el servidor solo utilizando una clave de certificado específica. Si bien esto puede mejorar la seguridad, también es difícil deshacerse de ella si se configura o actualiza incorrectamente. Tenga en cuenta utilizar HPKP con precaución y asegúrese de una configuración adecuada.

Resumen

En este laboratorio, exploramos importantes consideraciones de seguridad al desarrollar aplicaciones web con Flask. Cubrimos medidas para prevenir ataques de Cross-Site Scripting (XSS) y Cross-Site Request Forgery (CSRF), así como la seguridad de las respuestas JSON y la configuración de encabezados de seguridad y opciones de cookies. Siguiendo estas prácticas de seguridad, puede mejorar la seguridad de sus aplicaciones Flask y proteger los datos de los usuarios de posibles vulnerabilidades.