Eviter les Injections mysql

Eviter les Injections mysql - PHP - Programmation

Marsh Posté le 17-02-2010 à 14:29:25    

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

Reply

Marsh Posté le 17-02-2010 à 14:29:25   

Reply

Marsh Posté le 17-02-2010 à 14:38:45    

oui,  
mais si tu peux utilise PDO

Reply

Marsh Posté le 18-02-2010 à 01:36:48    

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) ?

Reply

Marsh Posté le 18-02-2010 à 13:28:37    

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
 

Reply

Marsh Posté le 18-02-2010 à 14:29:49    

Merci ! Sympa ça

Reply

Marsh Posté le 22-02-2010 à 14:35:11    

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

Reply

Marsh Posté le 22-02-2010 à 15:43:50    

johnson950 a écrit :

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


 
plus rapide, plus portable, plus simple

Reply

Marsh Posté le 22-02-2010 à 16:50:00    

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
Reply

Marsh Posté le 22-02-2010 à 17:45:12    

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
Reply

Marsh Posté le 22-02-2010 à 17:52:17    

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
Reply

Marsh Posté le 22-02-2010 à 17:52:17   

Reply

Marsh Posté le 22-02-2010 à 18:01:44    

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
Reply

Marsh Posté le 22-02-2010 à 18:46:32    

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
Reply

Marsh Posté le 23-02-2010 à 10:03:01    

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
Reply

Marsh Posté le 23-02-2010 à 14:03:26    

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
Reply

Marsh Posté le 23-02-2010 à 15:29:08    

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
Reply

Marsh Posté le 23-02-2010 à 15:56:01    

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
Reply

Marsh Posté le 23-02-2010 à 16:06:24    

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. }

Reply

Marsh Posté le 23-02-2010 à 16:50:54    

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
Reply

Marsh Posté le 24-02-2010 à 10:01:46    

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
Reply

Marsh Posté le 13-10-2014 à 19:03:54    

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

Reply

Marsh Posté le 14-10-2014 à 14:39:17    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed