Sécurité

Principe de base : le serveur ne doit pas faire confiance au client. Il faut donc vérifier toutes les données envoyées par le client avant de les utiliser. Cela inclut les données envoyées par les formulaires, mais aussi éventuellement les données récupérées par une API ou dans une capture de paramètre d'URL.

Donc :

  • ne jamais utiliser eval sur des données envoyées par le client (eval is evil...)
  • ne jamais utiliser de données envoyées par le client pour exécuter directement des commandes système (ex. : os.system(), subprocess.run(), etc.) (shell injection)
  • ne jamais utiliser de données envoyées par le client pour exécuter des requêtes sans les protéger au préalable (SQL injection)
  • ne jamais afficher des donnéés envoyers par le client sans les échapper au préalable (ex. : return f"{nom}" ou {{! xxxx }} dans un template) (XSS)
  • ne jamais faire confiance à une validation des données effectuée côté client (ex: required, pattern, minlength, etc..), il faut toujours valider les données côté serveur. ...

D'autres attaques existent :

  • CSRF (Cross-Site Request Forgery) : une attaque qui consiste à faire exécuter une action sur un site web par un utilisateur sans son consentement (remède = token CSRF)
  • Clickjacking : une attaque qui consiste à faire cliquer un utilisateur sur un élément d'une page web en le superposant à un autre élément (remède = X-Frame-Options)
  • ...

Nous reviendrons plus particulièrement sur :

  • les injections SQL dans la partie sur les bases de données
  • les XSS dans la partie sur l'authentification

Plus (beaucoup plus) de lecture (en anglais) : https://cheatsheetseries.owasp.org/index.html