12
04/11/2019 1 Avec PHP 1 Couche persistance Une application web, est généralement basée sur une architecture 3 tiers Couche utilisateur Couche métier Couche persistance utilisateur Serveur 1 Serveur 2 IUT Aubière 2A S. Salva ([email protected]) 2 2

Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

1

Avec PHP

1

Couche persistanceUne application web, est généralement basée sur une architecture 3 tiers

Couche utilisateur Couche métier Couche

persistanceutilisateur

Serveur 1 Serveur 2

IUT Aubière 2A S. Salva ([email protected]) 2

2

Page 2: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

2

Couche persistance• Comment faire persister ?

• Bases de données• Bases NoSQL• Services Web• Fichiers, • etc.

IUT Aubière 2A S. Salva ([email protected]) 3

3

Manipulation de BD en PHP� Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL)

� Utiliser PDO (PHP Data Object)

� Permet d’éviter les injections SQL� Obligatoire en PHP7

IUT Aubière 2A S. Salva ([email protected]) 4

4

Page 3: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

3

2 mots sur les injections SQLAttaque (bien répandue) de sites web (mal protégés)

exemple:

$custId= $_POST[‘custID’];

$query = "Select * From Customer Where CustomerID = ‘$custID’ ";

Si on tape: cust1' or 1=1 -- => on a la liste de tous les clients

Si on tape:

Cust1'; select * from creditcard => on liste toutes les cartes de crédit

Cust1'; drop table creditcard => on les supprime (tant qu’à faire)

IUT Aubière 2A S. Salva ([email protected]) 5

5

2 mots sur les injections SQLLes préventions:

1. Ne pas se connecter sur une base avec des droits admin

2. Valider tout type de paramètre (ne contiennent pas de mot sql, pas de cotes,…

3. Utiliser les PreparedStatement (création de requêtes précompilées)

Les preparedStatement permettent préparer une requête avec des emplacements vide.

Les paramètres externes sont injectés dans les emplacement vides et sont forcement pris comme des chaines

IUT Aubière 2A S. Salva ([email protected]) 6

6

Page 4: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

4

Manipulation de BD en PHPExemple d’injection SQL avec PreparedStatement:

Résultat avec cust1' or 1=1 – :

final String sql = "Select * From Customer Where CustomerID = \"cust1' or 1=1 --\""

"cust1' or 1=1 --" est un attribut de la requête pour le Where

recherche dans la bd=> ne donnera rien

IUT Aubière 2A S. Salva ([email protected]) 7

7

Manipulation de BD en PHP

IUT Aubière 2A S. Salva ([email protected]) 8

8

Page 5: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

5

PDO� Connection à BD

� Utilisation de DSN (Data Source name) de la forme <database>:host=<host>;dbname=<dbname>

� Exemple : 'mysql:host=localhost;dbname=nomdevotrebase';

IUT Aubière 2A S. Salva ([email protected]) 9

9

PDO� Connection à BD

� Connection avec : $db = new PDO($dsn, $user, $password);

� Exception : try {code} catch (PDOException $e) {}

IUT Aubière 2A S. Salva ([email protected]) 10

10

Page 6: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

6

PDO� Préparation d’une requête:

� $query= ‘SELECT FROM foo WHERE id=? AND cat=?’;$stmt=$db->prepare($query)

� Ajout des paramètres dans requête:$stmt->bindValue(1,120,PDO::PARAM_INT)$stmt->bindValue(2,’bar’,PDO::PARAM_STR)

Spécifie le type

IUT Aubière 2A S. Salva ([email protected]) 11

11

PDOA la place du « ? », on peut aussi utiliser :motclé

$query=‘SELECT * FROM membres where pseudo = :pseudo’

IUT Aubière 2A S. Salva ([email protected]) 12

12

Page 7: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

7

PDO� Exécution d’une requête :

$stmt->execute() // pas de récupération de résultat ici

� Avec récupération de résultat:$stmt->execute();$results=$stmt->fetchall();Foreach ($results as $row)

Print $row[‘attribut’] // attribut = attribut d’une table

� Nb de résultats: $stmt->rowCount();

IUT Aubière 2A S. Salva ([email protected]) 13

13

PDO et refactorisation� Merci de ne pas mettre du Code PDO partout …

� Faire une classe Connection (récupérable sur http://berlin.iut.local/~progweb/)

Exemple:class Connection extends PDO { private $stmt;public function __construct(string $dsn, string $username, string $password) {

parent::__construct($dsn,$username,$password); $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }

}IUT Aubière 2A S. Salva ([email protected]) 14

14

Page 8: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

8

PDO et refactorisation/** * @param string $query

* @param array $parameters * * @return bool Returns `true` on success, `false` otherwise */

public function executeQuery(string $query, array $parameters = []) :bool{

$this->stmt = parent::prepare($query); foreach ($parameters as $name => $value) {

$this->stmt->bindValue($name, $value[0], $value[1]); } return $this->stmt->execute(); }

public function getResults() { return $this->stmt->fetchall();}IUT Aubière 2A S. Salva ([email protected]) 15

15

PDO et refactorisationUtilisation:$con=new Connection('mysql:host=localhost;dbname=test', $user, $pass)

$query = 'UPDATE news SET name = :name WHERE id = :id';

$con->executeQuery($query, array(’:id' => array($id,PDO::PARAM_STR ),’:name' => array($name, ,PDO::PARAM_STR) ));

$results=$con-> getResults(); si on a des résultats à récupérer (après un Select par exemple)

IUT Aubière 2A S. Salva ([email protected]) 16

16

Page 9: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

9

Classe Connection

Connexion à la BD

Méthodes pdo_php de

bases

Composée du code en PDO

Rôle: préparer les requêtes, injecter les paramètres, exécuter la requête

=> Découpler l’accès bas niveau de la BD du reste du projet

Non rôle: ne traite pas les erreursPas d’affichage

!! Ne pas retourner d’objet statement (objet retourné par l’appel prepare)!! Ne pas faire de fetchall (ou autre) or de cette classeChacun son rôle

17

17

DAL

Intro aux DAL� Couche d’accès aux données (DAL)

18

Couche utilisateur Couche métier Couche

persistanceutilisateur

Serveur 1 Serveur 2

• Couche généralement composée de plusieurs classes• Permet de gérer les données à la sauce Objet

• on y trouve des patrons : singleton, factory, voire stratégie• Cours suivant

IUT Aubière 2A S. Salva ([email protected])

18

Page 10: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

10

Intro aux DAL� DAL Data Access Layer

� Plusieurs Modèles :

� Table Data Gateway� Active Record� Data Mapper� etc.

IUT Aubière 2A S. Salva ([email protected]) 19

19

Intro aux DALTable Data Gateway

Couche métier

Class Book

Isbn, titre, year

getter, setter,

Class BookGateway

Find(id)FindByISBN(isbn)FindByYear(year)FindAll()Insert(isbn,titre)Update(id)Delete(id)

IUT Aubière 2A S. Salva ([email protected]) 20

20

Page 11: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

11

Intro aux DALClasse BookGateway

� Classe qui agit comme passerelle entre tables et objets métier� Une instance manipule toutes les lignes de la table� Manipulation type CRUD

$b = new BookGateway(new Connection('...')); // Insert a new record $id = $b->insert(’isbn’,’titre’);

// Update it$b->update($id, ’titre2’); // Delete it$b->delete($id);

IUT Aubière 2A S. Salva ([email protected]) 21

21

Intro aux DALclass BookGateway { private $con;

public function __construct(Connection $con) { $this->con = $con; }

//méthodes qui font appel à la classe Connectionpublic function insert(int $isbn, string $titre) {} public function update(int $id, string $titre) {} public function delete(int $id); }

IUT Aubière 2A S. Salva ([email protected]) 22

22

Page 12: Couche persistance - LIMOSsesalva/files/php2.pdf · Manipulation de BD en PHP Ne pas utiliser les mots clés mysql_ (pour éviter attaques type inj. SQL) Utiliser PDO (PHP Data Object)

04/11/2019

12

Intro aux DALClass BookGatewayExemple méthode insert:

public function insert(string $isbn, string $titre) { $query='INSERT INTO BookTable VALUES (:isbn,:titre)’;

$this->con->executeQuery($query, array( ’:isbn' => array($isbn,PDO::PARAM_STR),

’:titre' => array($titre, ,PDO::PARAM_STR) ));

return $this->con->lastInsertId(); }

Pour find, findall, il faut extraire les résultats (fetchall, foreach…)

IUT Aubière 2A S. Salva ([email protected]) 23

23