Développement sécurisé d'applications web Flask

FlaskFlaskBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous explorerons les considérations de sécurité importantes lors du développement d'applications web utilisant Flask. Nous aborderons des sujets tels que l'injection de scripts croisés (Cross-Site Scripting - XSS), la falsification de requêtes entre sites (Cross-Site Request Forgery - CSRF), la sécurité des données JSON, les en-têtes de sécurité et les options de cookies sécurisés. En suivant ces étapes, vous apprendrez à renforcer la sécurité de vos applications Flask.

Note : Vous devez créer le fichier de code vous-même et l'exécuter dans l'environnement. Vous pouvez prévisualiser l'état du service Flask sur Web 5000.

Injection de scripts croisés (Cross-Site Scripting - XSS)

L'injection de scripts croisés (Cross-Site Scripting - XSS) est une vulnérabilité qui permet aux attaquants d'injecter des scripts malveillants dans les pages web affichées aux utilisateurs. Pour prévenir les attaques XSS dans Flask, suivez ces directives :

  • Toujours échapper le texte pour empêcher l'inclusion de balises HTML arbitraires.
  • Être prudent lors de la génération de HTML sans l'aide de modèles Jinja2.
  • Utiliser la classe Markup pour échapper les données soumises par l'utilisateur.
  • Éviter d'envoyer des fichiers HTML ou de texte provenant de fichiers téléchargés.

Exemple de code :

## 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)

Pour exécuter le code, enregistrez-le dans un fichier appelé app.py et exécutez la commande flask run.

Falsification de requêtes entre sites (Cross-Site Request Forgery - CSRF)

La falsification de requêtes entre sites (Cross-Site Request Forgery - CSRF) est une attaque qui trompe les utilisateurs pour qu'ils effectuent des actions involontaires sur un site web. Pour prévenir les attaques CSRF dans Flask, suivez ces directives :

  • Utiliser des jetons uniques pour valider les requêtes qui modifient le contenu du serveur.
  • Stockez le jeton dans le cookie et le transmettez avec les données du formulaire.
  • Comparez le jeton reçu sur le serveur avec celui stocké dans le cookie.

Exemple de code :

## app.py

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

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

@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'):
            ## Supprimer le profil de l'utilisateur
            return redirect(url_for('index'))
    return 'Requête invalide'

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

Pour exécuter le code, enregistrez-le dans un fichier appelé app.py et exécutez la commande flask run.

Sécurité des données JSON

Dans Flask, il est important de s'assurer de la sécurité des réponses JSON. Dans les versions antérieures à Flask 0.10, les tableaux de niveau supérieur n'étaient pas sérialisés en JSON en raison d'une vulnérabilité de sécurité. Cependant, ce comportement a été modifié et les tableaux de niveau supérieur sont désormais sérialisés. Il est recommandé d'utiliser la dernière version de Flask pour profiter de cette amélioration de sécurité.

En-têtes de sécurité

Les navigateurs reconnaissent divers en-têtes de réponse pour contrôler la sécurité. Il est recommandé de réviser et d'utiliser les en-têtes de sécurité suivants dans votre application Flask :

  • HTTP Strict Transport Security (HSTS) : Indique au navigateur de convertir toutes les requêtes HTTP en HTTPS.
  • Content Security Policy (CSP) : Spécifie d'où les différents types de ressources peuvent être chargées.
  • X-Content-Type-Options : Force le navigateur à respecter le type de contenu de la réponse.
  • X-Frame-Options : Empêche les sites externes d'incorporer votre site dans un iframe.

Vous pouvez utiliser l'extension Flask-Talisman pour gérer l'HTTPS et les en-têtes de sécurité dans votre application Flask.

Options de définition des cookies

Lorsque vous définissez des cookies dans Flask, il est important de prendre en compte les options de sécurité pour protéger les données sensibles. Certaines options recommandées sont :

  • Secure : Limite les cookies au trafic HTTPS uniquement.
  • HttpOnly : Protège le contenu des cookies contre la lecture avec JavaScript.
  • SameSite : Restreint la manière dont les cookies sont envoyés avec les requêtes provenant de sites externes.

Exemple de code :

## 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()

Pour exécuter le code, enregistrez-le dans un fichier appelé app.py et exécutez la commande flask run.

HTTP Public Key Pinning (HPKP)

L'HTTP Public Key Pinning (HPKP) est une fonction de sécurité qui indique au navigateur de s'authentifier auprès du serveur en utilisant uniquement une clé de certificat spécifique. Bien que cela puisse renforcer la sécurité, il est également difficile de révoquer si la configuration initiale ou la mise à niveau est incorrecte. Considérez donc d'utiliser l'HPKP avec prudence et assurez-vous d'avoir une configuration appropriée.

Récapitulatif

Dans ce laboratoire, nous avons exploré les considérations de sécurité importantes lors du développement d'applications web avec Flask. Nous avons abordé les mesures pour prévenir les attaques par injection de scripts croisés (Cross-Site Scripting - XSS) et par falsification de requêtes entre sites (Cross-Site Request Forgery - CSRF), ainsi que la sécurisation des réponses JSON et la définition d'en-têtes de sécurité et d'options de cookies. En suivant ces bonnes pratiques de sécurité, vous pouvez renforcer la sécurité de vos applications Flask et protéger les données des utilisateurs contre les vulnérabilités potentielles.