DevAngers AFPA
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Classe qui simplifiant les connexions et requêtes

5 participants

Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Classe qui simplifiant les connexions et requêtes

Message par Douffy Le Bucheron Mer 26 Jan - 0:08

J'hésitais entre "PDO" et "PHP/MySQL" pour poster celà ...

Bref, j'ai créé (et oui !!!) cette petite classe qui simplifie pas mal les choses pour la connexion et la création de requête lors de développement en php.
Elle utilise PDO.
Vous avez probablement déjà ce genre de truc sous le coude (voir en beaucoup plus élaboré) mais bon ... si ça tente quelqu'un -> prenez !
Vous y trouverez 4 méthodes (afficher(), ajouter(), modifier() et supprimer() qui correspondent à SELECT..., INSERT..., UPDATE... et DELETE...) ainsi qu'une 5éme "sql()", plus générale, regroupant les 4 premières).
Je pensais du coup mettre les 4 premières en "private" , mais bon ... autant laisser chacun choisir sa méthode préférée Very Happy

Code:

<?php
/*
*************************************************************************   
*                                                      
*   CLASSE DE GESTION D'ACCES A UNE BASE DE DONNEES MYSQL            
*                                                      
*************************************************************************
*   Auteur : Jérôme Gaillard                                 
*   Nom du fichier : "acces_db.php"                              
*   Date de derniére MAJ : 25/01/2011                           
*************************************************************************
*                                                      
*   Ne pas oublier d'inclure le fichier: include_once("acces_db.php");   
*                                                      
*   -----------------------------------------------------------------   
*   Exemple de réation de requêtes d'affichage (SELECT)               
*   -----------------------------------------------------------------   
*   $sql = "SELECT * FROM table";                              
*   $connect = new acces_db("host;dbname;login;pass");               
*   $result = $connect->afficher($sql);                           
*                                                      
*   On peut alors utiliser le tableau "$result" à 2 dimensions:         
*      $result[i][nom_champs]                                 
*      -> i : numéro de ligne (entier non nul débutant à 1            
*      -> nom_champs : nom du champs tel qu'il est dans la base      
*                                                      
*                                                      
*   -----------------------------------------------------------------   
*   Exemple de réation de requêtes d'ajout (INSERT)                  
*   -----------------------------------------------------------------   
*   $sql = "INSERT INTO table(champs) VALUES(valeurs)";               
*   $connect = new acces_db("host;dbname;login;pass");               
*   $connect->ajouter($sql);                                 
*                                                      
*                                                      
*   -----------------------------------------------------------------   
*   Exemple de réation de requêtes de modification (UPDATE)            
*   -----------------------------------------------------------------   
*   $sql = "UPDATE table SET champs1 = 'aaa' WHERE champs2 = 'bbb'";   
*   $connect = new acces_db("host;dbname;login;pass");               
*   $result = $connect->modifier($sql);                           
*   echo $result.' ligne(s) modifiée(s)';                        
*                                                      
*   Retourne le nombre de lignes modifiées                        
*                                                      
*                                                      
*   -----------------------------------------------------------------   
*   Exemple de réation de requêtes de suppression (DELETE)            
*   -----------------------------------------------------------------   
*   $sql = "DELETE FROM table WHERE champs2 = 'bbb'";               
*   $connect = new acces_db("host;dbname;login;pass");               
*   $result = $connect->supprimer($sql);                        
*   echo $result.' ligne(s) supprimée(s)';                        
*                                                      
*   Retourne le nombre de lignes supprimées                        
*                                                      
*                                                      
*   -----------------------------------------------------------------   
*   Exemple d'utilisation de la méthode de requête générale            
*   -----------------------------------------------------------------   
*   $sql = "SELECT / INSERT / UPDATE / DELETE ...";                  
*   $connect = new acces_db("host;dbname;login;pass");               
*   $result = $connect->sql($sql);                              
*                                                      
*   Cette méthode permet de passer toutes les requétes                
*   (SELECT, INSERT, UPDATE, DELETE).                           
*   Traitement du résultat "$result" en fonction du type de requête.   
*                                                      
*************************************************************************   
*/

   class acces_db{
      private $hostname;
      private $dbname;
      private $login;
      private $mdp;      
      
      public function acces_db($str){
         $tab = explode(';',$str);
         if(count($tab)==4){
            $this->hostname = trim($tab[0]);
            $this->dbname = trim($tab[1]);
            $this->login = trim($tab[2]);
            $this->mdp = trim($tab[3]);
         }
      }
      
      private function connexion(){
         $dbb = new PDO('mysql:host='.$this->hostname.';dbname='.$this->dbname, $this->login, $this->mdp);
         return $dbb;
      }
            
      public function afficher($sql){
         $sql = trim($sql);
         try{
            $tabResult = array();
            $numLigne = 1;
            $bdd = $this->connexion();
            $reponse = $bdd->query($sql);
            while ($donnees = $reponse->fetch()){
               foreach($donnees as $cle => $value){
                  if(!is_numeric($cle)){$tabResult[$numLigne][$cle] = $value;}
               }
               $numLigne++;
            }
            $reponse->closeCursor();
            return $tabResult;
         }catch(Exception $e){
            die('Erreur : '.$e->getMessage());
         }
      }
      
      public function ajouter($sql){
         $sql = trim($sql);
         try{
            $bdd = $this->connexion();
            $bdd->exec($sql);
         }catch(Exception $e){
            die('Erreur : '.$e->getMessage());
         }
      }
      
      public function modifier($sql){
         $sql = trim($sql);
         try{
            $bdd = $this->connexion();
            $nbr_modifs = $bdd->exec($sql);
            return $nbr_modifs;
         }catch(Exception $e){
            die('Erreur : '.$e->getMessage());
         }
      }
      
      public function supprimer($sql){
         $sql = trim($sql);
         try{
            $bdd = $this->connexion();
            $nbr_sup = $bdd->exec($sql);
            return $nbr_sup;
         }catch(Exception $e){
            die('Erreur : '.$e->getMessage());
         }
      }

      public function sql($sql){
         $sql = trim($sql);
         switch(strtoupper(substr($sql,0,6))){
            case 'SELECT':
               return $this->afficher($sql);
               break;
            case 'INSERT':
               return $this->ajouter($sql);
               break;
            case 'UPDATE':
               return $this->modifier($sql);
               break;
            case 'DELETE':
               return $this->supprimer($sql);
               break;
            default:
               return 'Requête inconnue';
               break;
         }
      }
   }
?>
Douffy Le Bucheron
Douffy Le Bucheron
3,2 quarts
3,2 quarts

Messages : 82
Date d'inscription : 08/10/2010
Age : 39
Localisation : Angers / Cognac / Angoulême (stage)

Spécialités
Expert en: Rien
Maître en: Pas grand Chose
Débutant en: Tout

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par ControleZede Mer 26 Jan - 0:52

Très bonne idée, j'avais fait un truc dans ce genre mais c'était pas objet.

Je vais le faire le tour dès que j'aurais 5 minutes.
ControleZede
ControleZede
3,2 quarts
3,2 quarts

Messages : 62
Date d'inscription : 22/12/2010
Age : 53
Localisation : Clermont-Créans

Spécialités
Expert en:
Maître en: péhachepé, acheteumeuleu, javastruc
Débutant en: Le cécharpe, c'est ce qu'on se met autour du cou en hiver non ?

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par steeverlight Mer 26 Jan - 0:54

Very Happy félicitations !! c'est très bon !!
steeverlight
steeverlight
Admin
Admin

Messages : 457
Date d'inscription : 11/10/2010
Age : 49
Localisation : Partout !

Spécialités
Expert en: Blague à Steeve !
Maître en: Silverlight
Débutant en: Système, Office, Conception, DotNet, Web, Php, Base de données

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par Boudpain Mer 26 Jan - 10:20

Très bonne idée. Je vais essayer.
Boudpain
Boudpain
3,2 quarts
3,2 quarts

Messages : 88
Date d'inscription : 08/10/2010
Age : 33
Localisation : Herbignac

Spécialités
Expert en:
Maître en:
Débutant en:

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par nathur Mer 26 Jan - 13:49

Génial Douffy ! merci ! ça va me faire gagner du temps ! cheers
Effectivement en private ça peut être bien... Sinon, tu as testé d'éventuelles failles de sécurité ?
nathur
nathur
Hey mais mec !
Hey mais mec !

Messages : 414
Date d'inscription : 08/10/2010
Age : 45
Localisation : La jub !

Spécialités
Expert en:
Maître en:
Débutant en: Tout ! mais cherche à s'améliorer ...

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par Douffy Le Bucheron Mer 26 Jan - 16:27

Failles de sécu ... kézako ?
Non dans mon monde (souris vertes et petits hérissons violets) y'a jamais de faille ^^
Douffy Le Bucheron
Douffy Le Bucheron
3,2 quarts
3,2 quarts

Messages : 82
Date d'inscription : 08/10/2010
Age : 39
Localisation : Angers / Cognac / Angoulême (stage)

Spécialités
Expert en: Rien
Maître en: Pas grand Chose
Débutant en: Tout

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par ControleZede Mer 26 Jan - 19:09

Houlà.

La sécurité en php c'est vaste.
ControleZede
ControleZede
3,2 quarts
3,2 quarts

Messages : 62
Date d'inscription : 22/12/2010
Age : 53
Localisation : Clermont-Créans

Spécialités
Expert en:
Maître en: péhachepé, acheteumeuleu, javastruc
Débutant en: Le cécharpe, c'est ce qu'on se met autour du cou en hiver non ?

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par nathur Mer 26 Jan - 23:53

heu ... injection sql ? j'ai lu un truc là-dessus...
nathur
nathur
Hey mais mec !
Hey mais mec !

Messages : 414
Date d'inscription : 08/10/2010
Age : 45
Localisation : La jub !

Spécialités
Expert en:
Maître en:
Débutant en: Tout ! mais cherche à s'améliorer ...

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par ControleZede Jeu 27 Jan - 1:47

Si tu as une authentification sur ton site (username/password), tu authentifies tes utilisateurs en faisant typiquement:
Code:
$sql = "SELECT user_id FROM users WHERE usename = '" . $_POST["username"] . "' AND password = '" . $_POST["password"] . "';";
(je passe sur le chiffrement du mot de passe qu'il faut faire systématiquement)


Pour un utilisateur ayant pour identifiants jeanDupond / azerty , la commande SQL concaténée sera:
Code:
SELECT  user_id FROM users WHERE usename = 'jeanDupond' AND password = 'azerty';
Là tout va bien.

Mais si un petit malin veut s'introduire dans ton application à l'insu de ton plein gré, il n'aura qu'à taper:

Username: toto' OR 1 = 1; #
Password: (laisser vide)

Le résultat de la concaténation sera:
Code:
SELECT  user_id FROM users WHERE usename = 'toto' OR 1 = 1; #' AND password = '';
Le # (dièze) sert pour les commentaires en MySQL, donc tout ce qui se trouve après sera ignoré.

Et comme 1 est toujours égal à 1 (aussi bizarre que ça puisse sembler), ton pirate entre à tous les coups.

Là c'est une méthode simple pour la démonstration, PDO possède des mécanismes pour éviter ce genre d'attaques, notamment les requêtes préparées, mais ce n'est pas suffisant.

Il faut donc vérifier au millimètre tout ce qui est soumis par les utilisateurs, y compris les champs qu'ils ne sont pas censés pouvoir modifier (listes, cases à cocher, boutons radio).

Car tout ce qui peut passer par le protocole HTTP peut être trafiqué. Il existe des extensions Firefox qui permettent d'intercepter les soumissions de formulaires et d'en modifier les valeurs à volonté avant des finir de les envoyer au serveur.

Il existe également des logiciels capables de scanner rapidement les trous de sécurité communs dans les applications web.

En résumé, chaque donnée reçue doit:

- Etre du type attendu (pas facile à vérifier dans un language non typé)
- Etre au format attendu
- D'une valeur et/ou d'une longueur bornées
- Ne pas contenir de caractères spéciaux (dont les plus grands tueurs: ; # et --)
- Ne pas contenir de mots-clés SQL, HTML, PHP ou JavaScript.

Il faut être parano et tout vérifier, tout ! Ce n'est pas une option ! Faites chauffer les REGEX !

D'où peut-être l'intérêt de concevoir une classe pour intégrer de tels mécanismes aux échanges avec le SGBD le plus simplement possible. Curieusement ça ne semble pas exister (en tout cas j'ai pas trouvé).
ControleZede
ControleZede
3,2 quarts
3,2 quarts

Messages : 62
Date d'inscription : 22/12/2010
Age : 53
Localisation : Clermont-Créans

Spécialités
Expert en:
Maître en: péhachepé, acheteumeuleu, javastruc
Débutant en: Le cécharpe, c'est ce qu'on se met autour du cou en hiver non ?

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par nathur Jeu 27 Jan - 12:56

ok, merci ctrlZ ! si ça peut éviter un 'FUCKED' sur son site.... hein CriCri ?
nathur
nathur
Hey mais mec !
Hey mais mec !

Messages : 414
Date d'inscription : 08/10/2010
Age : 45
Localisation : La jub !

Spécialités
Expert en:
Maître en:
Débutant en: Tout ! mais cherche à s'améliorer ...

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par ControleZede Jeu 27 Jan - 14:04

Lol, y'a déjà eu des morts chez vous ???
ControleZede
ControleZede
3,2 quarts
3,2 quarts

Messages : 62
Date d'inscription : 22/12/2010
Age : 53
Localisation : Clermont-Créans

Spécialités
Expert en:
Maître en: péhachepé, acheteumeuleu, javastruc
Débutant en: Le cécharpe, c'est ce qu'on se met autour du cou en hiver non ?

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par nathur Jeu 27 Jan - 15:37

CriCri s'est fait piraté un site qu'il a créé et il y avait écrit ce mot à la place du site...
nathur
nathur
Hey mais mec !
Hey mais mec !

Messages : 414
Date d'inscription : 08/10/2010
Age : 45
Localisation : La jub !

Spécialités
Expert en:
Maître en:
Débutant en: Tout ! mais cherche à s'améliorer ...

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par Boudpain Ven 28 Jan - 9:50

houai ! Le pirate (lui ou un autre ) a recommencé et il a pirater le serveur (Hébergeur MavenHosting) et il a mis un fichier index à la con dans tous les dossier de tous les sites hébergé. Gros bordel chez Maven. Il a fait sa sur plusieurs serveur Mave (Voir poste sur le site du Zéro). Donc site indisponible quelque jour, à cause de Maven qui ne me donnais pas les infos pour que je fasse une redirection d'url. La meilleure défense contre un pirate c'est la sauvegarde.
Boudpain
Boudpain
3,2 quarts
3,2 quarts

Messages : 88
Date d'inscription : 08/10/2010
Age : 33
Localisation : Herbignac

Spécialités
Expert en:
Maître en:
Débutant en:

Revenir en haut Aller en bas

Classe qui simplifiant les connexions et requêtes Empty Re: Classe qui simplifiant les connexions et requêtes

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum