Renderizado seguro de HTML con Flask

PythonPythonBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Cuando se devuelve HTML (el tipo de respuesta predeterminado en Flask), cualquier valor proporcionado por el usuario que se muestre en la salida debe escaparse para protegerse de ataques de inyección. En esta práctica, aprenderá a usar escape para lograr esto. Además, las plantillas HTML renderizadas con Jinja, que se presentan más adelante, lo harán automáticamente. Por ahora, puede simplemente usar escape para hacer esto manualmente.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python/BasicConceptsGroup -.-> python/strings("Strings") python/ModulesandPackagesGroup -.-> python/using_packages("Using Packages") python/AdvancedTopicsGroup -.-> python/decorators("Decorators") subgraph Lab Skills python/strings -.-> lab-148875{{"Renderizado seguro de HTML con Flask"}} python/using_packages -.-> lab-148875{{"Renderizado seguro de HTML con Flask"}} python/decorators -.-> lab-148875{{"Renderizado seguro de HTML con Flask"}} end

Escape

En este paso, aprenderá a usar escape para protegerse de los ataques de inyección.

  1. Abra el archivo html_escaping.py y primero importe la clase Flask y escape.
from flask import Flask
from markupsafe import escape
  1. A continuación, cree una instancia de la clase Flask.
app = Flask(__name__)
  1. Luego usamos el decorador route() para crear una ruta / con una función de vista llamada escaping. En la función, defina un fragmento de código JavaScript y use escape para renderizarlo como texto, escapando cualquier carácter que tenga un significado especial en HTML.
@app.route('/')
def escaping():
    input = "<script>alert('XSS attack');</script>"
    escaped_input = escape(input)
    return f"User input: {escaped_input}"
  1. Crear un punto de entrada main del script para iniciar la aplicación Flask en el puerto 5000, habilitando el modo de depuración.
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. Para ejecutar la aplicación, primero use los siguientes comandos para lanzar la aplicación Flask en la terminal:
python3 html_escaping.py

Luego abra la pestaña "Web 5000" ubicada en la parte superior de la interfaz, actualice la página y debería ver el mensaje:
XSS attack prevention example

  • Las etiquetas <script> se muestran seguras como texto sin ser ejecutadas como JavaScript, demostrando la prevención de un ataque XSS.

Resumen

En esta práctica, hemos aprendido cómo usar escape para escapar manualmente la entrada. Esto puede ser muy útil cuando se trata de ataques potencialmente dañinos. Más adelante aprenderemos cómo renderizar plantillas con Jinja, que puede hacer esto de manera automática y eficiente.