Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2798 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Suivante
Auteur Sujet :

[PHP/MySQL] Questions de sécurité

n°1491777
skeye
Posté le 15-12-2006 à 12:24:02  profilanswer
 

Reprise du message précédent :

MagicBuzz a écrit :

bon, ben alors pkoi tout le monde utilise les fonctions proprio mysql ou autre ? :o


l'habitude.:o
 
Puis bon t'as pas toujours la main sur le serveur...:o


---------------
Can't buy what I want because it's free -
mood
Publicité
Posté le 15-12-2006 à 12:24:02  profilanswer
 

n°1491778
MagicBuzz
Posté le 15-12-2006 à 12:24:57  profilanswer
 

à noter surtout qu'en C# par exemple, on peut indifférement utiliser les objets pour OLEDB ou les fonctions proprio : la syntaxe est la même, seuls le nom de objets change :
 
// OLEDB
OleDbConnection cnxOle = new OldDbConnection(OleDbConnectionString);
// SQL Server
SqlConnection cnxSql = new SqlConnection(SqlConnectionString);
// Oracle
OracleConnection cnxOra = new OracleConnection(OraConnectionString);
 
C'est vachement plus pratique.
Là en MySQL, ce qui me dérange par dessus tout, c'est que chaque SGBD bien avec ses sets d'instructions qui ont leur syntaxe propre. Du coup le bordel à maintenir...

n°1491779
skeye
Posté le 15-12-2006 à 12:28:49  profilanswer
 

C'est pour ça qu'ils ont créé PDO, je suppose... ;)
http://fr3.php.net/manual/fr/ref.pdo.php


---------------
Can't buy what I want because it's free -
n°1491782
MagicBuzz
Posté le 15-12-2006 à 12:37:23  profilanswer
 

:jap:

n°1491828
Djebel1
Nul professionnel
Posté le 15-12-2006 à 14:21:31  profilanswer
 

MagicBuzz a écrit :


genre tu veux faire un IN qui porte sur des flottants. tu fais quoi pour t'assurer que le gars tapes pas "10,5" qui sera interprété comme "10 ou 5" ? tu passes une chaîne de caractères ? ça va pas marcher des masses...


Personnellement en PHP, mes classes ont toutes des "SQL getters".
Par exemple si une string peut être null, ça renverra 'null' si elle est nulle, '"'.mysql_real_escape_string($maString).'"' si elle ne l'est pas.
Si c'est un float, tu peux rajouter dans la méthode un str_replace pour virer les virgules.
Tu pourras également typer chacune des variables (integer, string, float, ...).

Message cité 2 fois
Message édité par Djebel1 le 15-12-2006 à 14:22:54
n°1491829
leflos5
On est ou on est pas :)
Posté le 15-12-2006 à 14:21:36  profilanswer
 

MagicBuzz a écrit :

Windows 2003 Server Standard Edition : 800 € (500 € pour la Web Edition qui est suffisante)
SQL Server 2005 Express : 0 €
IIS 6.1 : 0 €
 
C'est ça que t'appelle des millions d'euros ?
 
Le temps gagné en n'ayant pas à redévelopper la gestion des autorisations suffit à économiser l'investissement.
Parle de choses que tu connais, merci.


J'avais mal interprêté :d Cela dit détends ton slip  :o

n°1491831
skeye
Posté le 15-12-2006 à 14:23:59  profilanswer
 

Djebel1 a écrit :

Personnellement en PHP, mes classes ont toutes des "SQL getters".
Par exemple si une string peut être null, ça renverra 'null' si elle est nulle, '"'.mysql_real_escape_string($maString).'"' si elle ne l'est pas.
Si c'est un float, tu peux rajouter dans la méthode un str_replace pour virer les virgules.
Tu pourras également typer chacune des variables (integer, string, float, ...).


 
Donc tu as du spécifique aux données dans tes classes métier.:o
C'est mal.:o


---------------
Can't buy what I want because it's free -
n°1491833
MagicBuzz
Posté le 15-12-2006 à 14:27:40  profilanswer
 

Djebel1 a écrit :

Personnellement en PHP, mes classes ont toutes des "SQL getters".
Par exemple si une string peut être null, ça renverra 'null' si elle est nulle, '"'.mysql_real_escape_string($maString).'"' si elle ne l'est pas.
Si c'est un float, tu peux rajouter dans la méthode un str_replace pour virer les virgules.
Tu pourras également typer chacune des variables (integer, string, float, ...).


- Attention : "" <> null. C'est très chiant quand tu travailles avec ANSI NULLS désactivé (logiquement désactivé par défaut)
- Pour les floats à virgule, si tu reçois un format américain, le str_replace fait faire juste...
 
Par contre, ensuite, évidement, tu peux développer ta propre lib d'abstraction et de contrôle des pramètres. Mais disons que c'est un peu carrément stupide que ce ne soit pas directement intégré dans PHP, c'est ce que je reproche en fait.
 
Mais bon, maintenant il semble que PDO résoud le problème (c pas trop tôt, en ASP ça fait 8 ans que j'utilise ce système :o)

n°1491834
MagicBuzz
Posté le 15-12-2006 à 14:28:49  profilanswer
 

leflos5 a écrit :

J'avais mal interprêté :d Cela dit détends ton slip  :o


Moi le matin j'ai la tête dans le cul.
Et quand j'ai la tête dans le cul, je suis de mauvais poil.
Et quand je suis de mauvais poil, j'ai mon caleçon qui me serre :o

n°1491836
skeye
Posté le 15-12-2006 à 14:29:58  profilanswer
 

MagicBuzz a écrit :

- Attention : "" <> null. C'est très chiant quand tu travailles avec ANSI NULLS désactivé (logiquement désactivé par défaut)
- Pour les floats à virgule, si tu reçois un format américain, le str_replace fait faire juste...

 

Par contre, ensuite, évidement, tu peux développer ta propre lib d'abstraction et de contrôle des pramètres. Mais disons que c'est un peu carrément stupide que ce ne soit pas directement intégré dans PHP, c'est ce que je reproche en fait.

 

Mais bon, maintenant il semble que PDO résoud le problème (c pas trop tôt, en ASP ça fait 8 ans que j'utilise ce système :o)


avant tu pouvais jouer avec PEAR :: DB, mais je sais pas ce que ça faisait, en fait...[:joce]


Message édité par skeye le 15-12-2006 à 14:30:52

---------------
Can't buy what I want because it's free -
mood
Publicité
Posté le 15-12-2006 à 14:29:58  profilanswer
 

n°1491870
Djebel1
Nul professionnel
Posté le 15-12-2006 à 15:03:16  profilanswer
 

skeye a écrit :

Donc tu as du spécifique aux données dans tes classes métier.:o
C'est mal.:o


non, je mettais ça en exemple, mais en réalité j'utilise une classe d'abstraction db, donc c'est pas spécifique à la bdd.
Par exemple je vais pas faire un mysql_real_escape_string mais un $this->db->quoteSmart()

 
MagicBuzz a écrit :

- Attention : "" <> null.


ouais en fait pour faire propre faut mapper les champs de ta bdd vers les arguments de tes classes (par exemple avec un fichier XML, un peu à la manière de Castor pour java). Ainsi, les SQL getters peuvent savoir s'ils doivent renvoyer 'null' ou "". Bon je dois dire que c'est casse-couille et qu'en général j'ai la flemme :D

Message cité 1 fois
Message édité par Djebel1 le 15-12-2006 à 15:04:24
n°1491877
skeye
Posté le 15-12-2006 à 15:10:57  profilanswer
 

Djebel1 a écrit :

non, je mettais ça en exemple, mais en réalité j'utilise une classe d'abstraction db, donc c'est pas spécifique à la bdd.
Par exemple je vais pas faire un mysql_real_escape_string mais un $this->db->quoteSmart()


Dans ce cas je vois pas l'intérêt d'avoir une méthode dans ta classe qui retourne la chaine échappée...[:urd]
Si tu as une classe qui gère l'accès à la db, c'est là que tu dois échapper tes chaines au moment où tu en as besoin...


---------------
Can't buy what I want because it's free -
n°1491911
Djebel1
Nul professionnel
Posté le 15-12-2006 à 15:59:25  profilanswer
 

pour ce fameux problème des valeurs nulles. Ca me saoule de faire un test avant chaque insertion pour chaque champ pour savoir si je dois mettre 'null', ou "", ou '"'.$var.'"'
 
Donc j'en fais une méthode une bonne fois pour toute dans mon objet, et c'est réglé, toutes les requètes ne font jamais autre chose que  
insert ...values ('.$objet->getSqlName().', '.$objet->getSqlDescription().')'
 
Je trouve ça assez pratique.

n°1491914
skeye
Posté le 15-12-2006 à 16:01:28  profilanswer
 

Je suis pas fan...[:skeye]


---------------
Can't buy what I want because it's free -
n°1491980
vanadium
N° Atomique : 23
Posté le 15-12-2006 à 17:03:19  profilanswer
 

Djebel1 a écrit :

pour ce fameux problème des valeurs nulles. Ca me saoule de faire un test avant chaque insertion pour chaque champ pour savoir si je dois mettre 'null', ou "", ou '"'.$var.'"'
 
Donc j'en fais une méthode une bonne fois pour toute dans mon objet, et c'est réglé, toutes les requètes ne font jamais autre chose que  
insert ...values ('.$objet->getSqlName().', '.$objet->getSqlDescription().')'
 
Je trouve ça assez pratique.


 
Et si jamais tu devais faire évoluer cet objet ? tu dois alors recoder tes méthodes, tu t'exposes à des erreurs inutilement.
Il vaut mieux que tes objets aient par ex un array qui definisse ton objet ainsi que le type de chaque champ comme ceci par ex :
 

Code :
  1. /**
  2. * Category object class
  3. *  
  4. * @author Jerome Loisel
  5. * @copyright Jerome Loisel
  6. * @package kernel
  7. **/
  8. class Category extends MyObject
  9. {
  10. /**
  11.  * Category constructor
  12.  *  
  13.  * @param array of vars to assign to category attributes
  14.  *  
  15.  * @return void
  16.  */
  17. function Category($vars = null)
  18. {
  19.  $table = "category";
  20.  $this->MyObject($table, $vars);
  21.  $attributes = array(
  22.  'id' => array('data_type' => XOBJ_DTYPE_INT, 'value' => null, 'maxlength' => '4'),
  23.  'name' => array('data_type' => XOBJ_DTYPE_TXTBOX, 'value' => null, 'maxlength' => '30'), 
  24.  'root' => array('data_type' => XOBJ_DTYPE_INT, 'value' => null, 'maxlength' => '4'),
  25.  'usable' => array('data_type' => XOBJ_DTYPE_INT, 'value' => null, 'maxlength' => '1') );
  26.  $this->setAttributes($attributes);
  27. }
  28. }


 
Ainsi, s'il faut faire un changement sur l'objet, on ne le fait qu'ici. La classe MyObject s'occupera de nettoyer les champs suivant leur 'data_type'.
 
Et le gestionnaire d'objet pour instancier un objet, récupérer une collection d'objets, mettre à jour, effacer... :  
 

Code :
  1. /**
  2. * Category Manager class
  3. *  
  4. * @author Jerome Loisel
  5. * @copyright Jerome Loisel
  6. * @package kernel
  7. **/
  8. class CategoryManager extends MyObjectManager
  9. {
  10. /**
  11.  * Category Manager constructor
  12.  *  
  13.  * do not instanciate this object directly
  14.  * use : get_manager("category" ); instead
  15.  *  
  16.  * @return void
  17.  */
  18. function CategoryManager()
  19. {
  20.  $specs = array(
  21.  'table' => "category",
  22.  'keyName' => 'id',
  23.  'className' => 'Category' );
  24.  $this->MyObjectManager($specs);
  25. }
  26. }


 
Je ne dis pas que c'est comme ça qu'il faut faire. Mais en faisant ainsi, on écrit une seule fois les choses dans MyObject et dans MyObjectManager puis dans les classes qui dérivent on définit le comportement en fonction dy type de chaque champ de la table.
Il y a certainement d'autres façons de faire, j'ai personnellement adoptée celle ci pour sa réutilisabilité. :)
 
EDIT : toutes les méthodes construisant les requetes sont faites dans MyObjectManager de façon générique. C'est pour ça que ça peut paraitre un peu vide, mais c'est tout ce qu'il est nécessaire d'écrire pour que les méthodes abstraites puissent faire leur travail . :)


Message édité par vanadium le 15-12-2006 à 17:05:03
n°1491984
skeye
Posté le 15-12-2006 à 17:07:37  profilanswer
 

Mon dieu.[:pingouino]
Laisse tomber l'usine à gaz...[:pingouino]


---------------
Can't buy what I want because it's free -
n°1491993
vanadium
N° Atomique : 23
Posté le 15-12-2006 à 17:15:03  profilanswer
 

Un seul fichier de 18ko pour écrire de façon générique toutes les requêtes nécessaires. C'est réutilisable à souhait : Tu veux ajouter un champ à ta table ? modifie les attributs de l'objet dans le contructeur de celui-ci et le changement est répercuté automatiquement sur toute ton application. :)
 
EDIT : et pour instancier un gestionnaire d'objet on préfèrera l'inversion de contrôle : de cette façon lorsque l'on crée une nouvelle table (et donc classe d'objet et de gestionnaire d'objet), la fonction d'instanciation est automatiquement utilisable avec celle ci.
 
 

Code :
  1. /*
  2. *  This function is used to return an Object  Manager
  3. *  @param string name of the object manager to instanciate
  4. * @param bool optional : if TRUE, if handler does not exists, no trigger error is raised
  5. * @return &Object {@link ObjectManager} ; FALSE if failure
  6. */
  7. function &get_manager($name, $optional = false)
  8. {
  9. static $handlers;
  10. $name = strtolower(trim($name));
  11. if (!isset($handlers[$name]))
  12. {
  13.         if ( file_exists( $hnd_file = SCRIPT_ROOT_PATH.'/class/object/class.'.$name.'.php' ) )
  14.  {
  15.             require_once $hnd_file;
  16.         }
  17.         $class = ucfirst($name).'Manager';
  18.         if (class_exists($class))
  19.  {
  20.             $handlers[$name] =& new $class();
  21.         }
  22.     }
  23.     if (!isset($handlers[$name]) && !$optional )
  24. {
  25.         trigger_error('Class <b>'.$class.'</b> does not exist<br />Manager Name: '.$name, E_USER_ERROR);
  26.     }
  27.     if ( isset( $handlers[$name] ) )
  28. {
  29.      return $handlers[$name];
  30.     }
  31. else
  32. {
  33.  return false;
  34. }
  35. }


 
 
Ex : je crée ma classe tartempion (et donc la table du meme nom :D). Pour avoir un manager de cette table, il me suffit de faire :

Code :
  1. // Pas besoin de faire de require_once, ni autre chose : ma fonction d'inversion de controle s'occupe de tout une fois pour toute et pour moi :)
  2. $tartempion_manager =& get_manager('tartempion');


Message édité par vanadium le 15-12-2006 à 17:22:39
n°1491994
skeye
Posté le 15-12-2006 à 17:16:54  profilanswer
 

ah j'ai pas dit que c'était pas du "joli design", hein...[:dawa]
mais parfois faut savoir s'arrêter, dans la vraie vie, quand même...quand tu commences à avoir 70 classes dans 12 packages rien que pour afficher un hello world faut se poser des questions...[:joce]


---------------
Can't buy what I want because it's free -
n°1492000
vanadium
N° Atomique : 23
Posté le 15-12-2006 à 17:19:36  profilanswer
 

skeye a écrit :

ah j'ai pas dit que c'était pas du "joli design", hein...[:dawa]
mais parfois faut savoir s'arrêter, dans la vraie vie, quand même...quand tu commences à avoir 70 classes dans 12 packages rien que pour afficher un hello world faut se poser des questions...[:joce]


 
2 classes abstraites pour le noyau. Et ensuite on rajoute 2 classes qui en dérivent pour chaque table comme ci-dessus (1.5ko par fichier si t'aime faire des commentaires lol) . ça ne fait ni 70 classes, ni 12 packages. Je n'aime pas coder la même chose 2 fois, et puis la réutilisabilité du code c'est important. :)


Message édité par vanadium le 15-12-2006 à 17:21:31
n°1492002
skeye
Posté le 15-12-2006 à 17:23:41  profilanswer
 

C'était une image...[:moule_bite]
 
Néanmoins j'utilise très régulièrement mettons une 50aine de tables d'une base de données qui en comporte 450 environ. T'imagines ton truc sur ce genre d'applis?:D
'fin bref sur un vrai projet un peu complexe, vouloir faire ce genre de choses c'est plus d'emmerdes que de gains... ;)


---------------
Can't buy what I want because it's free -
n°1492007
vanadium
N° Atomique : 23
Posté le 15-12-2006 à 17:32:46  profilanswer
 

Explique moi en quoi faire un fichier php de 1.5ko pour chaque table est lourd ?
 
Au contraire, toute l'écriture des requetes est géré dans la classe MyObjectManager, ce qui minimise carrément le risque d'erreur puisque tu n'écrit les choses qu'une fois et une seule.
Une architecture telle basée sur la le design pattern 'template factory' est hautement efficace pour un système complexe puisqu'on écrit très peu de code, et que c'est toujours le même code qui gère les select, les update etc...
 
une fois que le fonctionnement du modèle abstrait est validé, tu es sur que toutes les autres classes qui vont dériver de ce modèle fonctionneront parfaitement. Alors que si tu réecris les choses pour chaque table, tu multiplies le risque d'erreur par le nombre de tables.

n°1492013
skeye
Posté le 15-12-2006 à 17:37:01  profilanswer
 

C'est une façon de voir les choses...qui est très typique d'un étudiant n'ayant pas vraiment eu l'occasion de travailler sur un vrai projet.[:skeye]
 
L'intention est bonne, mais dans la pratique ça ne se fera quasiment jamais...on n'ira jamais (du moins très rarement) aussi loin dans l'abstraction, c'est trop complexifier ton architecture pour pas assez de gain...


---------------
Can't buy what I want because it's free -
n°1492019
vanadium
N° Atomique : 23
Posté le 15-12-2006 à 17:41:37  profilanswer
 

Il n'y a aucun gain niveau performances. En revanche, au niveau temps de codage, le gain est énorme par rapport à quelqu'un qui recode les mêmes choses pour chaque table.
 
Et je pense que tu ne devrais pas t'avancer trop vite lorsque tu parles de l'expérience de gens que tu ne connais pas. :D
 
Les designs patterns sont des valeurs sures : ce sont des réponses éprouvées aux problèmes récurrents d'architecture et de conception logiciel.

n°1492024
skeye
Posté le 15-12-2006 à 17:44:27  profilanswer
 

euh je sais ce qu'est un design pattern, merci.[:moule_bite]
'fin bref, fais ce que tu veux, mais ce que tu lui proposes est amha :
1) De l'overkill dans le contexte.
2) Probablement très très long à mettre en place pour lui.:o


---------------
Can't buy what I want because it's free -
n°1492032
vanadium
N° Atomique : 23
Posté le 15-12-2006 à 17:50:16  profilanswer
 

Je te rassure ça ne sera pas du tout long, ce que j'ai écrit plus haut est directement implémenté dans un projet libre et gratuit que j'ai recemment réalisé.
(cf signature)
Le code est sous licence GPL, je ne vois aucun inconvénient à ce qu'il le réutilises pour son application. :)

n°1492050
skeye
Posté le 15-12-2006 à 18:50:43  profilanswer
 

Tu oublies qu'il faudrait adapter son code existant, là...;)


---------------
Can't buy what I want because it's free -
n°1492070
vanadium
N° Atomique : 23
Posté le 15-12-2006 à 19:47:19  profilanswer
 

skeye a écrit :

Tu oublies qu'il faudrait adapter son code existant, là...;)


 
Heureusement tu y as pensé pour moi  :jap:

n°1492108
sircam
I Like Trains
Posté le 15-12-2006 à 22:52:22  profilanswer
 

skeye a écrit :

mais parfois faut savoir s'arrêter, dans la vraie vie, quand même...quand tu commences à avoir 70 classes dans 12 packages rien que pour afficher un hello world faut se poser des questions...[:joce]


Welcome to the J2EE bloat world [:benou_jap]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1492509
MrNatas
Parle klingon couremment
Posté le 18-12-2006 à 03:16:01  profilanswer
 

Heuuu... je.... je.... NE FRAPPEZ PLUS !
 
Je suis ravi de voir que les questions que je pose suscitent tant de réactions, mais comment dire, sans chercher à mordre la main qui me nourrit, je crois que c'est un peu trop pour ce que je veux faire, sans compter qu'il y à un mois je n'y connaissais rien au php ou si peu.  
 
Je n'ai jamais appris quoi que ce soit en prog si ce n'est par moi même et je crois que j'atteind mes limites quant j elis quelques post un peu plus haut. J'ai compris l'idée de l'Object Manager et j'adhère, pour le peu d'expérience que j'ai , je n'aime pas non plus réécrire et j'aime aussi réutiliser le code.
 
Mais je crois que c'est au dessus de mon niveau.
 
Donc... heuu... mysql_real_escape_string et vive la vie ?
 
Parce qu'en gros les IN à virgules flottantes et les BLOBS et je ne sais quoi d'autre, je ne m'en sert pas du tout, en général j'ai un auto incrément pour l'id et du texte pour le reste, et je suis heureux, E.R.E :D
 

n°1492525
skeye
Posté le 18-12-2006 à 08:57:01  profilanswer
 

Si tu es en php5, jette au moins un oeil à mysqli, quand même.;)
Sinon mysql_real_escape_string devrait faire l'affaire pour ton utilisation...


---------------
Can't buy what I want because it's free -
n°1493070
MrNatas
Parle klingon couremment
Posté le 19-12-2006 à 03:17:50  profilanswer
 

Je vais faire ça, défois que ça m'aide à être moins nul :D
 
J'ai collé le real escape, comme ça content les gens et moi aussi, J'ai plus le temps de paufiner, il faut que je publie, les clients font la gueule, donc j'y vais.  
 
Encore une question glon au passage, vu que je suis pas habitué du tout à MySQL en ligne de commande, vous auriez un truc avec mysqldump ou autre qui installe la base directement sur le serveur distant ?
 
Notez que je vais AUSSI faire un tour dans la doc ;)


---------------
http://www.gamerfrance.com : c'est bon mangezan.
n°1494360
nORKy
Grmmph...
Posté le 20-12-2006 à 16:07:48  profilanswer
 

vous connaissez PHP Doctrine ?

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[PHP][résolu] date, le mois n'apparait pas toujours![PHP/MySQL] compter nombre requetes SQL ?
[PHP/MySQL][résolu] Images dans un BLOB -> <img src="...">code source fonctions PHP
Récupérer les namespaces avec PHPMySQL et Dreamweaver 8
Comparer date MysqlRequête php/MySQL
Plus de sujets relatifs à : [PHP/MySQL] Questions de sécurité


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)