Pourquoi les auto-incréments sont dangereux ?

Par @jbnahan69
Serveurs
Source https://www.pxfuel.com/en/free-photo-ojibu

Lors du développement des sites web ou des applications web, nous utilisons une fonctionnalité courante dans les bases de données : l'auto-incrément.

L'auto-incrément est une colonne spéciale dans la base de données qui est alimentée par le moteur de base de données. Il est unique pour la table dans laquelle les données sont ajoutées. Il sert généralement de clé primaire (principale) pour charger des données précises.

La confidentialité

Le premier problème est la confidentialités. Ces clés primaires auto incrément sont utilisé par la suite dans les URL.

Prenons un exemple, votre entreprise propose un service dans lequel l'utilisateur peux enregistrer des données. Ces données sont stocké dans une base de données avec un auto incrément pour les retrouver plus tard. Cet auto incrément est utilisé dans l'URL pour afficher les données.

Je suis l'un de vos concurents et j'aimerai avoir une idée du volume d'utilisateur. Bien sûr vous ne donnez aucune indication sur les volumes que vous traitez. Et bien malgrè tout je peux en avoir une idée.

Pour cela, je m'inscrit comme un utilisateur, j'ajoute des données, puis j'attends un mois ou plus. Je reviens sur votre service et j'enregistre de nouvelles données.

Je récupère maintenant l'auto incrément présent dans les URL pour connaitre le volume de données enregistré sur la période sur votre service.

La sécurité

Comme je l'ai déjà dit dans la vidéo "Comment mon site a été piraté 2 fois (injection SQL)", une URL avec un auto-incrément est dangereuse.

Continuons avec notre exemple données pour la confidentialité. Si je vais sur la page d'affichage des données. Et que je modifie l'auto-incrément présent dans l'URL pour mettre le précédent. Que ce passe-t-il ?

Si le site est sécurisé, j'ai droit à un message d'erreur m'indiquant un refus d'accès.

Et malheureusement dans de trop nombreux cas, je vois les données ! C'est une fuite de données qu'il faut déclarer à la CNIL et dont-il faut assumer les conséquences !

L'article de la CNIL sur le sujet "Sécurité des sites web : les 5 problèmes les plus souvent constatés" (point 3)

Mais ce n'est pas tout, il y a encore un autre risque. Dans le cas d'une faille de sécurité de type "Injection SQL" la présence d'auto incrément simplifie la tache des malveillants.

En effet, la colonne se nomme dans 90% (pourcentage arbitraire pour dire presque tout le temps) des cas id. Et pour la table des utilisateurs nommé "users" dans 80% des cas (toujours arbitraire mais c'est moins souvent) il est très simple d'exfiltrer la liste des utilisateurs.

Par quoi les remplacer ?

Remplacer la identifiant auto incrément par un identifiant généré aléatoirement grâce à des fonctions de hachages fiables. Utilisez les mêmes que pour la cryptographie.

Je vous conseil les ULID ou GUID ou UUID qui sont disponible dans tous les langages de programmation. C'est un texte de 36 caractères qu'il est possible d'utiliser en tant que clé primaire.

Avantages de l'UUID (ou GUID)

  • Il est généré aléatoirement et donc imprévisible.
  • Évite les collisions d'identifiant sur les systèmes distribués.
  • Évite un aller-retour avec la DB pour le récupérer.
  • Évite la limite du nombre d'enregistrements dans la table comparé à un identifiant entier.

Inconvénient de l'UUID (ou GUID)

  • Le tri est complexe à cause du caractère aléatoire de l'identifiant.
  • Les performances d'écriture peuvent être impactées en cas d'index cluster (obligation de déplacer les données pour conserver l'ordre).
  • Risque de comportement aléatoire lors de la pagination (risque de doublon ou d'absence d'élément dans les pages).

Avantages de l'ULID

  • Le début de l'ULID contient l'horodatage de qui facilite le tri.
  • Tout comme l'UUID, il évite un aller-retour avec la base de données.
  • Il est également compatible avec les systèmes distribués.
  • Le risque de comportement aléatoire lors de la pagination est diminué.
  • Comme pour l'UUID, deviner les autres identifiants est presque impossible.

Inconvénient de l'UID

  • Le timestamp de la création de l'identifiant est exposé (dans les URLs par exemple).

 

Malheureusement il n'est pas toujours possible de les utiliser en tant que clé primaire. Certaine logiciel de base de données ont des limites qui empêche de réaliser des liaisons entre table si les tables utilise des clés primaire trop longue.

Pour palier à ce défaut, vous pouvez modifier la configuration du logiciel de base de données. Mais dans la pire des situations qu'est l'hébergement mutualisé, vous n'aurez pas le choix d'utiliser un auto incrément pour réaliser la liaison.

Conclusion

La confidentialité (secret des affaires) est en jeu lors de l'utilisation d'un auto incrément, mais le plus grave reste la sécurité.

La sécurité permet de garantir l'intégrité des données, leur sécurités et leur confidentialité et ces 3 points sont abordés dans le RGPD. Tout manquement est donc punissable par la CNIL.

 

Vidéo

Vidéo Youtube "Pourquoi les auto-incréments sont dangereux ?"
Author avatar
Jean-Baptiste Nahan

Consultant Expert Web, j'aide les entreprises ayant des difficultés avec leur projet Web (PHP, Symfony, Sylius).

@jbnahan69 | Macintoshplus | Linkedin | JB Dev Labs