SQL

Les bases
Le SQL est un langage permettant de communiquer avec une base de données. Ce langage informatique est notamment très utilisé par les développeurs web pour communiquer avec les données d’un site web
Structured Query Language
Ordre SELECT

Syntaxe
SELECT * | colonne | expression
FROM table;
SELECT liste les colonnes qui sont affichées
FROM indique la table d'où sont issues les colonnes
Exemple
SELECT nom, prenom, classe
FROM etudiants;
Affiche les colonnes 'nom', 'prenom, et 'classe' de la table etudiant
Expression arithmetique
| Operateur | Description |
|---|---|
| + | addition |
| - | soustraction |
| * | multiplication |
| / | division |
Exemple
SELECT nom, prenom, salaire, salaire + 300
FROM employees;
| nom | prenom | salaire | salaire + 300 |
|---|---|---|---|
| Bismuth | Paul | 100 | 400 |
| Nerat | Emile | 500 | 800 |
Alias
Change les entêtes de colonnes
Suivent directement le nom de la colonne (ou le mot clé AS)
Nécessitent des doubles quotes (" ") si contient un espace, un caractère spécial ou est sensible à la casse
Alias
SELECT nom, salaire*12 "salaire annuel", commission AS comm
FROM etudiants;
| nom | salaire annuel | comm |
|---|---|---|
| King | 3000000 |
Concaténation
Lier les colonnes ou chaînes de caractères à d'autres colonnes
se présente avec deux barres (||)
créé une colonne à l'affichage
Concaténation
SELECT nom || id AS "Etudiants"
FROM etudiants;
| Etudiants |
|---|
| King23 |
| Lee2345 |
Chaînes de caractères littérales
Un littéral est un caractère, un nombre, ou une date qui est inclus dans un select
Les dates et caractères littéraux doivent être entre simples quotes (' ')
Chaque chaîne de caractères est affichée une fois pour chaque ligne retournée
Chaînes de caractères littérales
SELECT 'Nom : ' || nom || ' - prenom : ' || prenom AS Etudiants
FROM etudiants;
| Etudiants |
|---|
| Nom : king - prenom : Paul |
| Nom : Lee - prenom : Edouard |
Chaînes de caractères littérales
SELECT 'Nom : ' || nom || ' - prenom : ' || prenom AS Etudiants
FROM etudiants;
| Etudiants |
|---|
| Nom : king - prenom : Paul |
| Nom : Lee - prenom : Edouard |
Ligne dupliquées
Par défaut, toutes les lignes sont affichées, même les doublons
Utiliser l'attribut DISTINCT
Restriction et tri
des données

Restreindre les données
Restreindre les lignes retournées avec la clause WHERE
La clause WHERE suit la clause FROM
SELECT colonnes
FROM table
WHERE condition(s)
Restreindre les données
SELECT id, nom, job_id, département_id
FROM employees
WHERE departement_id = 90;
| id | nom | job_id | departement_id |
|---|---|---|---|
| 100 | King | AD_PRESS | 90 |
| 101 | De Haan | AD_VP | 90 |
Restreindre les données
Chaînes de caractères et dates :
Doivent être entre simple quotes
Chaînes de caractères sensibles à la casse
Dates sensible au format
Format de date par défaut :
En Fr : DD/MM/AA
En En : DD-MM-YY
SELECT *
FROM etudiants
WHERE nom = 'King'
Conditions de comparaison
| Operateur | Signification |
|---|---|
| = | égal à |
| > | Plus grand que |
| >= | Plus ou égal à |
| < | Plus petit que |
| <= | Plus petit ou égal à |
| <> | non égal à |
| BETWEEN ... AND ... | Entre deux valeurs (inclues) |
| IN | correspond à une valeur de la liste |
| LIKE | Correspond à une recherche |
| IS NULL | est une valeur NULL |
Conditions de recherche
% : représente zéro, un ou plusieurs caractères
_ : représente un et un seul caractère
...
WHERE nom LIKE 'S%'
Conditions logiques
| Operateur | Signifaction |
|---|---|
| AND | retourne TRUE si les deux conditions sont vraies |
| OR | retourne TRUE si au moins une des conditions est vraies |
| NOT | retourne TRUE si la condition est fausse |
Tri des données
Trier des lignes avec la clause ORDER BY
ASC : ordre ascendant, par défaut
DESC, ordre descendant
Dernière clause de la requête
SELECT nom, prenom, date_naissance, classe
FROM etudiants
WHERE classe = 'DevWeb'
ORDER BY nom, prenom
Ordre INSERT

Syntaxe
INSERT INTO table [(colonne [, colonne ...])]
VALUES (value [, value ...])
Ajoute une ligne à la fois
Mettre les chaînes de caractères et date entre quotes simples
Expemple
INSERT INTO etudiants (nom, prenom, classe)
VALUES (king, lee, DevWeb);
Ordre UPDATE

Syntaxe
UPDATE table
SET colonne = value [, colonne = value ...]
[WHERE condition]
Modifie des lignes existantes
Peut mettre à jour plusieurs lignes en même temps
Expemple
UPDATE etudiants
SET nom = 'Lee', prenom='Paul'
WHERE id = 1
Ordre DELETE

Syntaxe
DELETE [FROM] table
[WHERE condition]
Supprime des lignes existantes
Sans condition, supprime tout une table
Exemple
DELETE etudiants
WHERE id = 2;
Injection SQL
C'est quoi ?
Une injection, c’est tout simplement lorsque l’utilisateur à la possibilité de manipuler le code et d’y « Injecter » ses propres commandes et ainsi manipuler la requête de base pour arriver a ses fins !
Comment ça marche ?
Dans SQL il existe la clause « Where » qui permet de faire des requêtes sous conditions, si une condition renvoie « vrai » c’est comme si elle n’existait pas. Forcement vous l’aurez compris 1=1 est toujours vrai ! Mais il existe des infinités de variantes ! ( 2=2, 20-7=13 .. )
Enfin dans SQL pour les commentaires on utilise « -- » ainsi terminer une injection par ces caractères nous permet de nous assurer qu’aucune autre action sera exécuté après la notre.
Exemple
Celle ci nous propose un input, dans le contexte on comprend qu’il faut entrer un numéro d’utilisateur.
Essayons avec l’utilisateur 2 :

Pour l'instant, tout va bien !
Exemple
Celle ci nous propose un input, dans le contexte on comprend qu’il faut entrer un numéro d’utilisateur.
Essayons avec l’utilisateur 2 :

Pour l'instant, tout va bien !
Exemple
Nous contrôlons la valeur de id, c’est de la que partira notre injection.
Essayons donc le fameux ‘or 1=1 -- :
Cette fois ci l’application est nettement plus bavarde ! En effet la clause « Where » est en quelque sorte ignorée puisqu’elle renvoie vrai.
Il y a donc ici une injection et il est possible de récupérer la liste de tout les utilisateurs.

Ainsi...
Tout ceci n'a pas trop d'intérêt, mais avec les injections suivantes, on peut récupérer pas mal d'info :
Déterminer l’utilisateur de la base de données
ID: 1' union select 1,user() --
First name: 1
Surname: root@localhostDéterminer le nom de la base de données
ID: 1' union select 1,database() --
First name: 1
Surname: dvwaRécupérer les mots de passes
ID: 1' union all select user,password from users --
First name: admin
Surname: 5f4dcc3b5aa765d61d8327deb882cf99Via un site tiers, je sais pas que ce mot de passe password
A lire
L'excellent article de Rémi Martin :
Base SQL
By plebweb
Base SQL
- 600
