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

  FORUM HardWare.fr
  Programmation
  PHP

  Eviter les Injections mysql

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Eviter les Injections mysql

n°1966895
johnson950
Posté le 17-02-2010 à 14:29:25  profilanswer
 

Bonjour,
 
La fonction "mysql_real_escape_string" suffit t-elle à éviter les injections mysql ?
 
Merci

mood
Publicité
Posté le 17-02-2010 à 14:29:25  profilanswer
 

n°1966901
stealth35
Posté le 17-02-2010 à 14:38:45  profilanswer
 

oui,  
mais si tu peux utilise PDO

n°1967050
Sheeloo
Enfoirés de nihilistes !
Posté le 18-02-2010 à 01:36:48  profilanswer
 

A ce propos, le fait d'utiliser PDO nous permet-il de ne plus utiliser mysql_real_escape_string ?  
 
Autre chose, si on utilise PDO il faut modifier chaque requête SQL (en plus de l'ouverture de la base) ?

n°1967190
stealth35
Posté le 18-02-2010 à 13:28:37  profilanswer
 

avec les requêtes préparer, tu n'auras plus besoin d'utilisé mysql_real_escape_string
 
pour la modif des requetes pas grand chose a modifié
au lieu de faire

Code :
  1. $sql = "SELECT login FORM user WHERE id = 1 AND valid = 1";


 
en requete preparé tu feras
 

Code :
  1. $sth = $pdo->prepare("SELECT login FORM user WHERE id = ? AND valid = ?" )
  2. $sth->execute(array(1, 1))


 
 
http://www.siteduzero.com/tutoriel [...] x-bdd.html
 

n°1967212
Sheeloo
Enfoirés de nihilistes !
Posté le 18-02-2010 à 14:29:49  profilanswer
 

Merci ! Sympa ça

n°1968157
johnson950
Posté le 22-02-2010 à 14:35:11  profilanswer
 

Merci pour vos réponses.
 
En quoi l'utilisation des PDO est mieux ?
Merci

n°1968183
stealth35
Posté le 22-02-2010 à 15:43:50  profilanswer
 

johnson950 a écrit :

Merci pour vos réponses.
 
En quoi l'utilisation des PDO est mieux ?
Merci


 
plus rapide, plus portable, plus simple

n°1968231
ZePRiNCE
Coucou, tu veux voir ma RTX ?
Posté le 22-02-2010 à 16:50:00  profilanswer
 

A ce propos j'ai assez cherché sur Google mais rien trouvé.
Les PDO sont-(elles?) vraiment sécurisées ?

 

Ca me dérange un peu de faire confiance à un bouzin dont je ne connais pas le fonctionnement interne.

 


Avant jbossais avec du sprintf+mysql_real_escape_string  (+ du is_numeric pour les variables ID & co), et là je refais un site.

 

Et j'hésite à avoir confiance [:petrus75]


Message édité par ZePRiNCE le 22-02-2010 à 16:52:08

---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
n°1968253
NewsletTux
<Insérez ici votre vie />
Posté le 22-02-2010 à 17:45:12  profilanswer
 

ce topic m'intéresse ...
 
quelle différence y a-t-il (point de vue sécurité :o) entre :

Code :
  1. $sth = $pdo->prepare("SELECT login FORM user WHERE id = ? AND valid = ?" )
  2.     $sth->execute(array(1, 1))


 
et :
 

Code :
  1. $query = sprintf("SELECT login FORM user WHERE id = '%d' AND valid = '%d'", 1, 1);


 
?
En mettant des intval, des abs, on est sûr d'avoir des numériques. En cela, je ne trouve pas PDO plus sécurisé. Reste l'échappement de chaines de caractères ... Mais %s permet déjà de se débarrasser de l'hexa, il ne reste "plus grand chose" ...


---------------
NewsletTux - outil de mailing list en PHP MySQL
n°1968257
ZePRiNCE
Coucou, tu veux voir ma RTX ?
Posté le 22-02-2010 à 17:52:17  profilanswer
 

Jcrois que c'est surtout + securisé parce que tu risques pas d'oublier un filtrage quelque part dans ton site :whistle:
 
Et sinon ce que tu fais ne suffit pas (enfin si puisque c'est des 1) mais si c'etait du _POST il faut mettre mysql_real_escape_string($_POST['leun'])


---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
mood
Publicité
Posté le 22-02-2010 à 17:52:17  profilanswer
 

n°1968258
NewsletTux
<Insérez ici votre vie />
Posté le 22-02-2010 à 18:01:44  profilanswer
 

oui effectivement, mais au vu de l'exemple avec des valeurs numériques, je ne suis pas rentré dans le mysql_*_escape_string.
 
Et concernant le filtrage, avec un sprintf si tu oublies une valeur, tu as de toutees façons une erreur... (sprintf : too few arguments ||too many arguments)
Reste encore l'éternel problème de pluralité des hébergeurs et compatibilité des applications (en particulier chez Free où l'activation de PDO est un peu folklorique).


---------------
NewsletTux - outil de mailing list en PHP MySQL
n°1968267
ZePRiNCE
Coucou, tu veux voir ma RTX ?
Posté le 22-02-2010 à 18:46:32  profilanswer
 

NewsletTux a écrit :

oui effectivement, mais au vu de l'exemple avec des valeurs numériques, je ne suis pas rentré dans le mysql_*_escape_string.
 
Et concernant le filtrage, avec un sprintf si tu oublies une valeur, tu as de toutees façons une erreur... (sprintf : too few arguments ||too many arguments)
Reste encore l'éternel problème de pluralité des hébergeurs et compatibilité des applications (en particulier chez Free où l'activation de PDO est un peu folklorique).


Nan jvoulais dire :
 
Si tu oublies de splintf-er/msqyl_real_escap-er une de tes requetes dans ton site, alors ça peut faire une faille :o
 
En passant tout par PDO, vu que t'as pu à faire ça... Pu d'oubli. Pu de failles (a priori)


---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
n°1968403
kao98
...
Posté le 23-02-2010 à 10:03:01  profilanswer
 

pdo, ça a avant tout comme avantages :
- abstraction de l'accès aux données (les fonctions mysql_* ne fonctionnent qu'avec mysql :o)
- orienté objet. Dans un projet OO, c'est quand même mieux d'utiliser du OO. Et pdo évite tout simplement d'écrire soit-même les classes d'accès aux données :spamafote:


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
n°1968502
stealth35
Posté le 23-02-2010 à 14:03:26  profilanswer
 

et les requetes preparer c'est quand même beaucoup plus rapide
 

Code :
  1. $stat = $pdo->prepare("INSERT INTO user VALUE(:login, :email)" );
  2.  
  3. foreach($users as $user)
  4. {
  5.    $stat->execute($user);
  6. }


 
qui permet d'avoir qu'une seule requete, au lieu dans boucler plein, et comme dis kao on évite de récrire des fonctions qui feront la même chose (mais en moins bien en plus), et si d'un jour a l'autre on veux passer sous Oracle, SQLite...., on aura juste une petit modif a faire dans la requête (et encore...), au lieu de tout changer

Message cité 1 fois
Message édité par stealth35 le 23-02-2010 à 14:06:16
n°1968546
Tirkyth
Posté le 23-02-2010 à 15:29:08  profilanswer
 

J'ajouterais un petit argument de lisibilité du code aussi. En admettant qu'on ait une requête complexe qui fasse énormément de where clauses, si on peut avoir la requête puis un tableau de paramètres simple plutôt qu'un sprintf avec 10 fois "mysql_real_escape_string", 3 fois "intval" etc, je pense que c'est bon à prendre également.


Message édité par Tirkyth le 23-02-2010 à 15:29:37
n°1968560
NewsletTux
<Insérez ici votre vie />
Posté le 23-02-2010 à 15:56:01  profilanswer
 

stealth35 a écrit :

et les requetes preparer c'est quand même beaucoup plus rapide
 
 et si d'un jour a l'autre on veux passer sous Oracle, SQLite...., on aura juste une petit modif a faire dans la requête (et encore...), au lieu de tout changer


 
waï mais bon : si tu fais un objet de connexion avec des méthodes de sélection DB + exécution requête, au final, tu n'as plus que ta classe à modifier. Ce que je veux dire, c'est que je ne dénigre absolument pas pdo et ton exemple de "insert" est effectivement assez "simple", mais avec un objet de connexion tu peux avoir le même truc :
 

Code :
  1. class DBConn()
  2. {
  3. ...
  4.     function Connect()
  5.     {
  6.     }
  7.     function execQuery($query)
  8.     {
  9.     }
  10. }
  11. $conn = new DBConn();
  12. $conn->Connect();
  13. foreach(users as $user)
  14. {
  15.     $query = sprintf("INSERT INTO users (login, passwd) VALUES('%s', '%s');", $user['login'], $user['passwd']);
  16.     $conn->execQuery($query);
  17. }


 
je pense à un truc de ce style. Je vois une différence, c'est que ta variable $query est instanciée autant de fois qu'il y a de passages dans la boucle, certes. mais au final, même avec PDO, t'as X users tu exécutes X fois la requête ...

Message cité 1 fois
Message édité par NewsletTux le 23-02-2010 à 15:56:35

---------------
NewsletTux - outil de mailing list en PHP MySQL
n°1968564
stealth35
Posté le 23-02-2010 à 16:06:24  profilanswer
 

non puisque c'est une requête préparer, tu peu aussi en faire avec l'extension mysql normal mais ca personne n'y pense
 
http://dev.mysql.com/doc/refman/5.0/fr/sqlps.html
 
t'aura l'avantage aussi du fetchAll, (actif dans mysqli sous php 5.3 avec mysqlnd), tu va recuperer tout ton tableau d'un seul coup au lieu de parcourir (ce qui comprend tout l'avantage du parcours de tableau),
mais encore une fois tu peux tres bien le faire avec une class
 

Code :
  1. $items = array();
  2. while($data = mysql_fetch_object($req))
  3. {
  4.    $items[] = $data;
  5. }

n°1968607
kao98
...
Posté le 23-02-2010 à 16:50:54  profilanswer
 

NewsletTux a écrit :


 
waï mais bon : si tu fais un objet de connexion avec des méthodes de sélection DB + exécution requête, au final, tu n'as plus que ta classe à modifier. Ce que je veux dire, c'est que je ne dénigre absolument pas pdo et ton exemple de "insert" est effectivement assez "simple", mais avec un objet de connexion tu peux avoir le même truc :
 

Code :
  1. class DBConn()
  2. {
  3. ...
  4.     function Connect()
  5.     {
  6.     }
  7.     function execQuery($query)
  8.     {
  9.     }
  10. }
  11. $conn = new DBConn();
  12. $conn->Connect();
  13. foreach(users as $user)
  14. {
  15.     $query = sprintf("INSERT INTO users (login, passwd) VALUES('%s', '%s');", $user['login'], $user['passwd']);
  16.     $conn->execQuery($query);
  17. }


 
je pense à un truc de ce style. Je vois une différence, c'est que ta variable $query est instanciée autant de fois qu'il y a de passages dans la boucle, certes. mais au final, même avec PDO, t'as X users tu exécutes X fois la requête ...


Mais pourquoi diable ré-inventer la roue carrée plutôt que d'utiliser une roue circulaire existante ?


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
n°1968770
NewsletTux
<Insérez ici votre vie />
Posté le 24-02-2010 à 10:01:46  profilanswer
 

kao98 a écrit :


Mais pourquoi diable ré-inventer la roue carrée plutôt que d'utiliser une roue circulaire existante ?


je vais faire l'essai, ça m'intéresse. en fait je m'étais fait une classe qui ressemble à  mon exemple ci_dessus, mais celle-ci renvoyait l'ID en cas d'INSERT, le affected_rows en cas de delete ou update, et la ligne en cas d'erreur ... (__LINE__) . Je vais voir ce qu'il est possible de récupérer avec les PS en cas d'erreur.


---------------
NewsletTux - outil de mailing list en PHP MySQL
n°2240198
gaenion
Posté le 13-10-2014 à 19:03:54  profilanswer
 

Salut à tous j'ai un petit souci, j'aimerai éviter les injection SQL mais je ne sais pas comment faire.
Un peut d'aide serait la bienvenu :  
 
Je vous montre mon code :  
 
ma page traitement.php :  
 

Code :
  1. <?php include('connect.php'); ?>
  2. <html>
  3. <head>
  4. <title>traitement</title>
  5. <meta charset="utf-8"/>
  6. <script type="text/javascript" src="form.js"></script>
  7. </head>
  8. <body>
  9. <div align="center">
  10.  <h1>Inscription validée</h1><br />
  11.  <a href="index.php">Nouvelle inscription</a>
  12.  <hr>
  13.  <br />
  14.  <?php
  15.   if(isset($_POST['submit']))
  16.   {
  17.    $email = $_POST['email'];
  18.    $phone = $_POST['phone'];
  19.    if($email && $phone)
  20.    {
  21.     $connect->beginTransaction();
  22.     $connect->query("INSERT INTO user VALUES ('', '$email','$phone', now())" );
  23.     $connect->commit();
  24.     /*echo "<font color='green'>Inscription validé</font>"; */
  25.    }
  26.   }
  27.   ?>
  28. </body>
  29. </html>

 
 
et ma page connect.php :  
 

Code :
  1. <?php
  2. try{
  3. $connect = new PDO('mysql:host=localhost;dbname=inscription', 'root', '');
  4. }
  5. catch(Exception $e){
  6. echo 'echec';
  7. exit();
  8. }
  9. ?>


 
En fait je voudrai juste évité les injection SQL sur mon champ "$email" et mon champ "$phone"
 
Merci pour votre aide

n°2240240
rufo
Pas me confondre avec Lycos!
Posté le 14-10-2014 à 14:39:17  profilanswer
 

Le topic l'a expliqué : tu fais une requête préparée et tu l'exécutes.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Eviter les Injections mysql

 

Sujets relatifs
Mysql : copier un champ vers un autre sauf s'il existe déjà[PHP/MYSQL] Definir un debut de journée.
Requete mysql qui s'execute avant l'execution de la pageRequete MySQL avec condition globale
[résolu] eviter blocage navigateur lors de recherche de villeInsertion Mysql champ Text plante ! via Zend
[RESOLU] Soucis avec mysql_fetch_array dans une fonctionAfficher le détail d'un enregistrement après un classement (PHP/MYSQL)
[PHP/HTML/MySql] Outils de dev freeware [Résolu]Problème d'integration du module javascript Lighbox avec une bdd mysql
Plus de sujets relatifs à : Eviter les Injections mysql


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR