Apprenez a valider vos donnees

credits

Apprenez a valider vos donnees

Cover credits

On ne doit jamais faire confiance aux données provenant d'un client : tout peut arriver.

Surtout ce que l'on n'a pas prévu.

Firefox OS Security team

Firefox OS phones

Revues de securite

Code vulnerable

You shall not pas credits

C'est trop tard: on a tue des chatons

You shall not pas credits

CVE

Facepalm

Mot de passe oublie ?

"Securise"


Un programme est sécurisé s'il se comporte exactement comme il a été conçu pour le faire.

Du code securise a 100% n'existe pas

  • Difficile de définir le comportement voulu pour un système complexe.
  • Impossible à formaliser
  • Très dur de vérifier/analyser le comportement du logiciel.

Gestion de risque

  • Risque = Probabilité d'un Evenement x Perte Maximale

Security is your job too

Challenge accepted credits

Data validation

owasp.org

1. Bonnes pratiques
de code

XSS: l'overflow du web

Script injection

Filtrer le contenu utilisateur

URL

  • Whitelist les schemes (http, https, ftp)
  • Hostname: caractères alphanumérique, ".", "-"
  • Peut être suivi de "/", "?", "#", end-of-string

Filtrer le contenu utilisateur

HTML

  • Toujours spécifier Content-Type et charset
  • body: entity-encode < > &
  • Paramètres des tags "style" et "on*": à éviter (multiples niveaux d'échappement)
  • Autres valeurs de params HTML: entourer avec ” et entity-encode < > & ” ’
  • ! metacaractères Unicode

Filtrer le contenu utilisateur

CSS

  • Feuilles de style: en local / servies par HTTPS
  • Si paramètres insérés dans du CSS: entourer avec ”. Echapper les caractères (0x00-0x1F), \, < > {, }, ” ’
  • text body: entity-encode < > &
  • Paramètres des tags "style": à éviter (multiples niveaux d'échappement)
  • CSS fourni par l'utilisateur: vérifications spécifiques

Filtrer le contenu utilisateur

JavaScript

  • Fichiers de script: en local / servis par HTTPS
  • Bannir eval(), innerHTML(), outerHTML(), setTimeout() avec des params utilisateurs.
  • Pour parser du JSON: utiliser JSON.parse() plutôt que eval().
  • Si paramètres insérés dans un block JS: échapper les caractères (0x00-0x1F), \, < > {, }, ” ’
  • Pour construire dynamiquement du HTML: utiliser innerText(), createElement(), createTextNode().

Content Security Policy

  • Header HTTP: Content-Security-Policy
  • Content-Security-Policy: default-src *; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'

Scan.js

  • https://github.com/mozilla/scanjs

XKCD http://xkcd.com/327

Injection de code

      query = "SELECT * FROM students WHERE 
                 name ='" + userName + "' AND age = 10;"
      userName = "Robert'; DROP TABLE students;--" 
      
      
      "SELECT * FROM students WHERE 
         name ='Robert'; DROP TABLE students;"
      

Whitelist / Blacklist

Denial Of Service

Connaitre ses ressources

  • Filtrer les données en entrées/sortie de grande taille
  • Stopper les processus trop consommateurs en temps/ressources

2. Bonnes pratiques
de test

quand on me demande si j'ai lancé les tests

testsofc Les joies du code

Be evil

  • Penser comme un attaquant
  • Tester des données malveillantes en entrée et les comportements inattendus

Pensez différemment

3. Connaître les menaces courantes

Proteger les donnees utilisateurs

  • Chiffrer les données utilisateurs sensibles.
  • Changer le mot de passe par défaut des serveurs d'applications, des comptes admin
  • Ne PAS stocker des données sensibles en clair (ex: mots de passe)
  • Réduire les risques de bruteforcing

Vulnerabilites web

Communications securisees

UX

Remember

Merci

Red panda (Firefox)
  • MDN: https://developer.mozilla.org
  • OWASP: https://www.owasp.org
  • Slides: http://github.com/arroway
  • IRC: arroway
Photo by Yortw