Développer des composants d’accès aux données SQL et NoSQL Flashcards
Quel est l’acronyme de CRUD ?
- Create
- Read
- Update
- Delete
Qu’est-ce que le CRUD ?
Le CRUD désigne les 4 principales opérations qu’il est possible de faire avec une données d’une manière générale en informatique. On peux créer (CRUD), lire (CRUD), mettre à jour (CRUD) et supprimer (CRUD) une donnée.
Dans le cadre du développement d’une application Web avec persistance des données, les opérations du CRUD sont la plupart du temps toutes utilsées pour manipuler des données stockées en base de données.
Quel est l’acronyme de BREAD ?
- Browse
- Read
- Edit
- Add
- Delete
Quelle est la différence entre le CRUD et le BREAD ?
BREAD est une proposition d’amélioration du CRUD. Le principal apport du BREAD est de scinder l’opération R (Read) du CRUD en deux sous-opérations B et R dans le BREAD. L’opération B doit permettre de lire un ensemble de données, tandis que l’opération R doit permettre de lire qu’une donnée spécifique.
Dans le cadre d’un site Web utilisant une base de données :
- Browse : doit retourner un ensemble d’entrées extraites de la base de données (exemple : retourner tous les articles du site)
- Read : doit retourner une seule entrée extraite de la base de données (exemple : retourner l’article dont l’id est 42)
Côté backend, comment peut on se défendre contre une injection SQL ?
Il existe plusieurs manières (qui peuvent se compléter) pour se protéger contre les injections SQL. Une des plus efficaces consiste à “prépaper” ses requêtes côté backend avant de les exécuter au niveau de la base de données.
La préparation consiste à analyser d’abord les données variables d’une requetes SQL (nom d’un utilisateur, mot de passe, …) pour détecter si ces données contiennent des codes SQL malicieux.
Des librairies fournissent une API complète pour préparer ses requêtes (par exemple le package natif PDO en PHP, ou encore le package node mysql2 en javascript/typescript). De tels outils utilisent par exemple les REGEX pour détecter si des scripts SQL malicieux se sont logés dans les paramètres lors de la préparation d’une requete.
En quoi consiste une attaque par injection SQL ?
Supposons un site web dans lequel un utilisateur peut s’authentifier à l’aide d’un formulaire classique. Côté backend, la requête (non remplie) pourrait être :
SELECT * FROM user WHERE name = ‘’ AND pass = ‘’ ;
Une personne malveillante peut alors saisir en nom d’utilisateur ‘admin’. Et surtout, au lieu de saisir un mot de passe comme cela est attendu dans le champ “mot de passe”, saisir un texte contenant une requête SQL. Par exemple, elle pourrait saisir le code SQL “ ‘ OR ‘1’=’1 “. (d’où le nom de l’attaque : injection SQL)
La requete exécutée côté base de données serait alors :
SELECT * FROM user WHERE name = ‘admin’ AND pass = ‘’ OR ‘1’=’1’ ;
La requête retourne un résultat, malheureusement valide, au backend. Et selon comment est codé ce dernier, la personne malveillante peut alors être autorisée à accéder à l’espace d’administration du site.
Connaissez vous un outil permettant de faire des analyses fines de pattern dans les chaines de caractères ?
Les REGEX permettent de faire cela. Les REGEX sont des motifs de recherches que l’on peut appliquer dans un texte et cela permet de détecter des pattern dans le texte voir d’extraires certaines données contenues dans un texte.
Les REGEX peuvent par exemple être utilisées pour vérifier si un mot de passe est suffisament complexe, ou encore pour détecter côté backend si un code malicieux a été inséré dans des données transmises par le frontend.
Les REGEX sont implémentées dans la plupars des langages de programmation (PHP, JS, Java, …)
Je veux obtenir toutes les informations de tous les articles (table ‘article’) de ma BDD. Quelle requête SQL je dois exécuter ?
SELECT * FROM article;
Je veux obtenir les titres de tous les articles (table ‘article’) de ma BDD et trier le résultat par ordre alphabétique. Quelle requête SQL je dois exécuter ?
SELECT title FROM article ORDER BY title ASC;
Je veux obtenir le nombre total d’article (table ‘article’) de ma BDD. Quelle requête SQL je dois exécuter ?
SELECT COUNT(*) FROM article;
Supposons deux tables ‘article’ (champs : id, title, author_id) et ‘author’ (champs : id, name). Je veux lister les titres de tous les articles écrits par l’auteur dont le ‘name’ est ‘admin’. Quelle requête SQL je dois exécuter ?
SELECT article.title
FROM article
JOIN author ON article.author_id = author.id
WHERE author.name = ‘admin’;
Je veux insérer un nouvel article dans ma table article (champs : id, title). Quelle requête SQL je dois exécuter ?
En supposant que le champ ‘id’ est un INTEGER en AUTO_INCREMENT, il me suffit de faire :
INSERT INTO article (title) VALUES (‘vive les croissants !’);
Je veux mettre à jour le titre de l’article dont l’id est 42. Quelle requête SQL je dois exécuter ?
UPDATE article SET title = ‘vive les croissants et les pains au chocolat !’ WHERE id = 42;
Je veux supprimer l’article dont l’id est 1337. Quelle requête SQL je dois exécuter ?
DELETE FROM article WHERE id = 1337;
Pouvez vous lister quelques grandes familles de type de test ?
Il existe par exemple les tests unitaires, les tests d’intégration et les tests end-to-end