Classe qui simplifiant les connexions et requêtes
5 participants
DevAngers AFPA :: Php :: Langage
Page 1 sur 1
Classe qui simplifiant les connexions et requêtes
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
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
- 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- 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
Re: Classe qui simplifiant les connexions et requêtes
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.
Je vais le faire le tour dès que j'aurais 5 minutes.
ControleZede- 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 ?
Re: Classe qui simplifiant les connexions et requêtes
félicitations !! c'est très bon !!
steeverlight- 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
Re: Classe qui simplifiant les connexions et requêtes
Très bonne idée. Je vais essayer.
Boudpain- 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:
Re: Classe qui simplifiant les connexions et requêtes
Génial Douffy ! merci ! ça va me faire gagner du temps !
Effectivement en private ça peut être bien... Sinon, tu as testé d'éventuelles failles de sécurité ?
Effectivement en private ça peut être bien... Sinon, tu as testé d'éventuelles failles de sécurité ?
nathur- 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 ...
Re: Classe qui simplifiant les connexions et requêtes
Failles de sécu ... kézako ?
Non dans mon monde (souris vertes et petits hérissons violets) y'a jamais de faille ^^
Non dans mon monde (souris vertes et petits hérissons violets) y'a jamais de faille ^^
Douffy Le Bucheron- 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
Re: Classe qui simplifiant les connexions et requêtes
Houlà.
La sécurité en php c'est vaste.
La sécurité en php c'est vaste.
ControleZede- 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 ?
Re: Classe qui simplifiant les connexions et requêtes
heu ... injection sql ? j'ai lu un truc là-dessus...
nathur- 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 ...
Re: Classe qui simplifiant les connexions et requêtes
Si tu as une authentification sur ton site (username/password), tu authentifies tes utilisateurs en faisant typiquement:
Pour un utilisateur ayant pour identifiants jeanDupond / azerty , la commande SQL concaténée sera:
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:
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é).
- Code:
$sql = "SELECT user_id FROM users WHERE usename = '" . $_POST["username"] . "' AND password = '" . $_POST["password"] . "';";
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';
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 = '';
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- 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 ?
Re: Classe qui simplifiant les connexions et requêtes
ok, merci ctrlZ ! si ça peut éviter un 'FUCKED' sur son site.... hein CriCri ?
nathur- 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 ...
Re: Classe qui simplifiant les connexions et requêtes
Lol, y'a déjà eu des morts chez vous ???
ControleZede- 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 ?
Re: Classe qui simplifiant les connexions et requêtes
CriCri s'est fait piraté un site qu'il a créé et il y avait écrit ce mot à la place du site...
nathur- 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 ...
Re: Classe qui simplifiant les connexions et requêtes
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- 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:
DevAngers AFPA :: Php :: Langage
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|