[PHP] Magic_quotes et conseil

Magic_quotes et conseil [PHP] - PHP - Programmation

Marsh Posté le 10-04-2007 à 12:49:55    

Bonjour
 
J'aurais une question, est -ce que je devrait désactiver les magi_quotes??
apparement ça serait plus prudent,
Qu'en pensez vous??
 
J'ai trouver ça sur le net ça parait pas mal ... et pas trop compliquer..
 
[url]
http://www.phpfrance.com/tutoriaux [...] gic-quotes[/url]
 
 
 
 
 

Reply

Marsh Posté le 10-04-2007 à 12:49:55   

Reply

Marsh Posté le 10-04-2007 à 13:33:33    

Bah... Cet article est très bien, il présente les différents aspects du problème.
Les désactiver permet une meilleure adaptation et une portabilité, mais il ne faut pas oublier les *_escape_string après, c'est tout :)

Reply

Marsh Posté le 10-04-2007 à 14:14:03    

Ou les requêtes préparées
Ou PDO


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 14:14:15    

:) merci ... au pasage... j'ai une autre question... je travail les sessions actuellement...Qu'en pensez vous niveau sécurité?
 
voici le traitement des sessions
 

Code :
  1. <?php
  2. if (isset($_POST['login']) && (!empty($_POST['login'])) && (isset($_POST['pass'])) && (!empty($_POST['pass']))) {
  3. mysql_connect("localhost", "root", "" ) or die (mysql_error());// on se connecte à MySQL
  4. mysql_select_db("administration" ) or die (mysql_error());// on sélectionne la base
  5. $pass = md5($_POST['pass']);
  6. $ident = mysql_query("SELECT login, password FROM identification WHERE login='".$_POST['login']."' AND password='".$pass."' " ) or die (mysql_error());
  7. if($ident_ok = mysql_fetch_array($ident)) {
  8. if (($ident_ok['login'] == $_POST['login']) && ($ident_ok['password'] == $pass)) {
  9.  session_start();
  10.  $_SESSION['sessid'] =  md5(uniqid(rand()));
  11.  $_SESSION['login'] = $_POST['login'];
  12.  $_SESSION['pass'] = $_POST['pass'];
  13.  $_SESSION['logged'] = 1;
  14.  ?>
  15.  <meta http-equiv="refresh" content="0; url=./page3.php?id=<?php echo $_SESSION['sessid'];?>" />
  16.  <?php
  17. }
  18. else {
  19. echo "<p>Votre Mot de pass ou votre login n'est pas valide.</p>";
  20. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  21. }
  22. }
  23. else {
  24. echo "<p>Votre Mot de pass ou votre login n'est pas valide.</p>";
  25. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  26. }
  27. }
  28. else {
  29. echo "<p>Vous avez oubliez de rentrer le login ou le mot de pass</p>";
  30. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  31. }
  32. ?>


 
Voici le début des pages protégées :
 

Code :
  1. <?php
  2. session_start();
  3. if ($_SESSION['logged'] == 1) {
  4. if(isset($_SESSION['login']) && isset($_SESSION['pass'])) {
  5.  if($_GET['id'] == $_SESSION['sessid']) {
  6.   echo $_SESSION['sessid'];
  7.   echo "<p>Votre Login est ".$_SESSION['login']."</p>";
  8.   echo "<p>Votre Mot de passe est ".$_SESSION['pass']."</p>";
  9.   echo phpinfo();
  10. ?>
  11. <a href="test_log.php">Retour</a>
  12. <br/><br/>
  13. <form method="POST" action="test_out.php">
  14. <input type="submit" value="Deconnexion" class="bouton_deco" name="appliquer"/>
  15. </form>
  16. <?php
  17.  }
  18.  else {
  19.   echo "Problème de connexion : Veuillez vous reconnecter";
  20.  }
  21. }
  22. else {
  23.  echo "Problème de connexion : Veuillez vous reconnecter";
  24. }
  25. }
  26. else {
  27. echo "Vous ne vous êtes pas loggé";
  28. }
  29. ?>

Reply

Marsh Posté le 10-04-2007 à 14:18:58    

lilougirl8 a écrit :

:) merci ... au pasage... j'ai une autre question... je travail les sessions actuellement...Qu'en pensez vous niveau sécurité?

 

voici le traitement des sessions

 
Code :
  1. <?php
  2. $ident = mysql_query("SELECT login, password FROM identification WHERE login='".$_POST['login']."' AND password='".$pass."' " ) or die (mysql_error());
 
Code :
  1. <meta http-equiv="refresh" content="0; url=./page3.php?id=<?php echo $_SESSION['sessid'];?>" />
  2.  <?php
  3. }
  4. else {
  5. echo "<p>Votre Mot de pass ou votre login n'est pas valide.</p>";
  6. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  7. }
 

Voici le début des pages protégées :

 

Deux choses :
-Comme dis précedemment, utilise des requêtes préparées, surtout pour des données sensibles comme celles ci.
-La redirection coté client, c'est la pire chose que tu puisse faire en cas d'érreur.


Message édité par Shinuza le 10-04-2007 à 14:20:05

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 14:23:00    

Pourquoi mon header ne passe pas..???
 
Il m'affiche page blanche
 
 

Code :
  1. <?php
  2. if (isset($_POST['login']) && (!empty($_POST['login'])) && (isset($_POST['pass'])) && (!empty($_POST['pass']))) {
  3. mysql_connect("localhost", "root", "" ) or die (mysql_error());// on se connecte à MySQL
  4. mysql_select_db("administration" ) or die (mysql_error());// on sélectionne la base
  5. $pass = md5($_POST['pass']);
  6. $ident = mysql_query("SELECT login, password FROM identification WHERE login='".$_POST['login']."' AND password='".$pass."' " ) or die (mysql_error());
  7. if($ident_ok = mysql_fetch_array($ident)) {
  8. if (($ident_ok['login'] == $_POST['login']) && ($ident_ok['password'] == $pass)) {
  9.  session_start();
  10.  $_SESSION['sessid'] =  md5(uniqid(rand()));
  11.  $_SESSION['login'] = $_POST['login'];
  12.  $_SESSION['pass'] = $_POST['pass'];
  13.  $_SESSION['logged'] = 1;
  14.  header("Location : page3.php?id=".$_SESSION['sessid']."" ) or die ("erreur" );
  15. }
  16. else {
  17. echo "<p>Votre Mot de pass ou votre login n'est pas valide.</p>";
  18. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  19. }
  20. }
  21. else {
  22. echo "<p>Votre Mot de pass ou votre login n'est pas valide.</p>";
  23. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  24. }
  25. }
  26. else {
  27. echo "<p>Vous avez oubliez de rentrer le login ou le mot de pass</p>";
  28. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  29. }
  30. ?>

Reply

Marsh Posté le 10-04-2007 à 15:04:56    

impossidble ça marche pas grrrrrrrrrrrr pkoi les choses simple deviennent elles toujours compliquées !!

Reply

Marsh Posté le 10-04-2007 à 15:06:37    

Isole le code que tu as changé dans une page de test pour identifier clairement le problème


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 15:08:35    

oula... quelle cretin.. simple erreur de syntaxe je savait pas que iln'y avais pas d'espace entre les ":"

Reply

Marsh Posté le 10-04-2007 à 15:09:23    

je sui super content... je faisai toutes mes redirection en meta.. ça ne me plaisais pas :d

Reply

Marsh Posté le 10-04-2007 à 15:09:23   

Reply

Marsh Posté le 10-04-2007 à 15:09:53    

parcontre les requetes préparés c'est compliquée non?

Reply

Marsh Posté le 10-04-2007 à 15:11:52    

Non, suffit de lire la doc, ensuite le choix est simple, prendre le risque de subir une injection, ou prendre le temps de faire quelque chose de propre


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 15:14:00    

tu aurais pas un site ou qui me permetrai d'appendre tout ça ?

Reply

Marsh Posté le 10-04-2007 à 15:37:10    

http://www.siteduzero.com/tuto-3-4 [...] paree.html
 
Google toussa, le tuto est gavé de fautes, mais ça résume bien la situation


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 15:41:28    

lilougirl8 a écrit :

Code :
  1. <?php
  2.  
  3. $ident = mysql_query("SELECT login, password FROM identification WHERE login='".$_POST['login']."' AND password='".$pass."' " ) or die (mysql_error());
  4. ?>



Injection SQL d'entrée de jeu, si quelqu'un rentre le login  

' OR 1=1; DROP TABLE identification; --


ça fait boum :o
 
Et comme noté par Shinuza, il y a des headers spécialement faits pour la redirection, au lieu de faire un truc crade à base de metas


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 10-04-2007 à 15:49:36    

masklinn a écrit :

' OR 1=1; DROP TABLE identification; --


une seule requête possible avec mysql_query, donc le drop table ne passera pas

Reply

Marsh Posté le 10-04-2007 à 15:55:54    

soju a écrit :

une seule requête possible avec mysql_query, donc le drop table ne passera pas


dans ce cas là, c'est guère mieux : le site va accorder l'autorisation de login au gars, avec le premier login dans la table...
généralement, le premier login qu'on saisi dans une table étant le login administrateur... chais pas ce qui est le mieux entre permettre à l'utilisateur de drop au table au hasard, ou accéder avec des droit d'admin à toute l'application afin de faire du sabottage plus précis et moins facilement détectable [:atari]

Reply

Marsh Posté le 10-04-2007 à 15:57:32    

MagicBuzz a écrit :

dans ce cas là, c'est guère mieux : le site va accorder l'autorisation de login au gars, avec le premier login dans la table...
généralement, le premier login qu'on saisi dans une table étant le login administrateur... chais pas ce qui est le mieux entre permettre à l'utilisateur de drop au table au hasard, ou accéder avec des droit d'admin à toute l'application afin de faire du sabottage plus précis et moins facilement détectable [:atari]


A oué, tu t'amuses à mélanger tes users et les admin dans la table toi  [:pingouino]


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 16:00:06    

Tu crées une table pour chaque profil d'user toi ?

Reply

Marsh Posté le 10-04-2007 à 16:01:39    

J'ai un accès BO pour les admin, j'ai jamais mélangé les deux, je vois pas l'intérêt, toi.

Message cité 1 fois
Message édité par Shinuza le 10-04-2007 à 16:01:59

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 16:08:14    

Shinuza a écrit :

J'ai un accès BO pour les admin, j'ai jamais mélangé les deux, je vois pas l'intérêt, toi.


l'intérêt ? ça s'appelle "l'interopérabilité".
je peux parfaitement communiquer avec un autre système qui utilise une base d'utilisateurs sans soucis. ça permet aussi et surtout de gérer des profils évolués de type "ACL". permettre à un même login/pass d'accéder à la fois au back office et au front office (c'est quand même pratique quand je veux contrôler que ma modif est effectuée correctement), ou simplement promouvoir et révoquer des droits simplement...
 
au contraire, il n'y a aucun intérêt à séparer les deux, mise à part multiplier la quantité de code par deux, alourdir la maintenance de l'application, et perdre les utilisateurs dans 25 urls et mots de passes à retenir pour accéder à une unique application :spamafote:

Reply

Marsh Posté le 10-04-2007 à 16:20:43    

En tout cas ça évite de vérifier ta précedente démonstration. J'utilise une classe qui gère l'identification, les sessions et l'acl.
Du coup je n'ai pas de code à copier, je place mes 3 lignes dans un fichier et il est "protégé".  
La majorité du temps je sépare les deux, et se logguer coté BO te loggue coté Front.
Mais c'est peu être pas la bonne méthode, j'ai jamais eu de problème de cette manière néanmoins [:sinclaire]


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 16:23:56    

sauf que ton système ne résoud rien : je vais sur une pge d'admin, j'utilise la même technique d'injection, et hop ! retour à la case départ (avec surtout une ergonomie pourrie sur le site, puisque tout est séparé, donc impossible à maintenir)

Reply

Marsh Posté le 10-04-2007 à 16:30:45    

Il faut déja connaitre l'adresse de la page d'admin :p
 
Plus sérieusement, j'vois pas le problème de maintenance, j'utilise un fichier qui gère les deux cas de figures, les procedures sont communes, seul le niveau par défaut change.
Le tout est paramétré dans un fichier de config.


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 19:10:35    

Ca ne change rien au problème: quand bien même une seule requête est permise, ça suffit à bypasser de manière triviale le système d'auth (et en faisant quelques recherches, on trouve facilement les adresses d'entrée des admins sur 9 sites sur 10)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 10-04-2007 à 20:07:32    

oula aparement ça se défoule ici lol... bon moi me revoila je planche sur PDO... ça m'a l'air detre pas mal pour la sécurité je posterai le resultat ou les erreurs lol

Reply

Marsh Posté le 10-04-2007 à 22:30:02    

Hop voila voila...qu'en penser vous...
 
Sinon pour les magic quotes je fais koi??
 
 

Code :
  1. <?php
  2. if (isset($_POST['login']) && (!empty($_POST['login'])) && (isset($_POST['pass'])) && (!empty($_POST['pass']))) {   
  3. $pass = md5($_POST['pass']);
  4. try
  5. {
  6. $db = new PDO("mysql:host=localhost;dbname=administration", "root", "" );
  7. $requete = 'SELECT login, password FROM identification WHERE login = :login AND password = :pass';   
  8. $requeteok= $db->prepare($requete);
  9. $requeteok->execute(array(":login" => $_POST['login'], ":pass" => $pass));
  10. }
  11. catch(Exception $e)
  12. {
  13. echo 'Erreur : '.$e->getMessage().'<br />';
  14. echo 'N° : '.$e->getCode();
  15. }
  16. if($resultat = $requeteok->fetch(PDO::FETCH_OBJ)) {
  17. if (($resultat->login == $_POST['login']) && ($resultat->password == $pass)) {
  18.  session_start();
  19.  $_SESSION['sessid'] =  md5(uniqid(rand()));
  20.  $_SESSION['login'] = $_POST['login'];
  21.  $_SESSION['pass'] = $_POST['pass'];
  22.  $_SESSION['logged'] = 1;
  23.  header("Location:./page3.php?id=".$_SESSION['sessid']."" ) or die (error_reporting(E_ALL));
  24.  exit;
  25. }
  26. else {
  27. echo "<p>Votre Mot de pass ou votre login n'est pas valide.</p>";
  28. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  29. }
  30. }
  31. else {
  32. echo "<p>Votre Mot de pass ou votre login n'est pas valide.</p>";
  33. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  34. }
  35. }
  36. else {
  37. echo "<p>Vous avez oubliez de rentrer le login ou le mot de pass</p>";
  38. echo "<a href='test_log.php'>Retour a la page de connexion</a>";
  39. }
  40. ?>


 
Je modifirai pour le $_POST['login'], Je sait qu'il faut pa les mettre en direct comme ça dans les requete mais c'est deja pour avoir un aperçu


Message édité par lilougirl8 le 10-04-2007 à 22:31:34
Reply

Marsh Posté le 10-04-2007 à 22:35:54    

MagicBuzz a écrit :

dans ce cas là, c'est guère mieux...

masklinn a écrit :

Ca ne change rien au problème: quand bien même une seule requête est permise...

jamais dit le contraire...
 
en tous cas ce qui pondent des tests (cf topic test recrutement) devrait penser à intégrer des questions sur la sécurité, on voit tellement de soit-disant développeurs php qui font ces erreurs que ça en devient inquiétant...

Reply

Marsh Posté le 10-04-2007 à 22:39:07    

...alors :D

Reply

Marsh Posté le 10-04-2007 à 22:43:34    

Et avec les requêtes préparées, pas besoin de *_escape_string ?

Reply

Marsh Posté le 10-04-2007 à 22:43:46    

Comparez au premier code, ça n'a RIEN a voir

 
Le_nain a écrit :

Et avec les requêtes préparées, pas besoin de *_escape_string ?

 

Non


Message édité par Shinuza le 10-04-2007 à 22:45:25

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 22:44:14    

c'est ce que je voudrai savoir lol !!
 
EDIT : donc c'est sécurisée la quand même ??


Message édité par lilougirl8 le 10-04-2007 à 22:46:26
Reply

Marsh Posté le 10-04-2007 à 22:47:45    

Ah, c'est cool ça, et pas besoin de gérer non plus les ' autours des chaines (alors qu'on ne met rien autour des entiers), je suppose ?

Reply

Marsh Posté le 11-04-2007 à 09:25:08    

Personne ne m'a répondu mai du coup pour les magic quotes je fais quoi?? c'est toujours la peine de les levée? Pui le code il es assez sécurisée

Reply

Marsh Posté le 11-04-2007 à 10:03:33    

C'"est de la merde, poubelle


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 11-04-2007 à 10:10:17    

poubelle mon code ou les magic quote lol...mechant!! :d

Reply

Marsh Posté le 11-04-2007 à 10:29:09    

magicquote pose surtout un énorme problème de portabilité.
 
effectivement, il rajoute des " \ " devant les caractères " ' " afin d'éviter le SQL Injection.
 
seulement, cela pose deux problèmes :
1/ programmatiquement parlant, c'est pas toujours très heureux, car ça va modifier les valeurs de certaines variables qu'on ne veut pas forcément impacter par ce changement (calcul MD5 d'un mot de passe par exemple, ou calcul de la longueur d'une chaine, etc.)
2/ si demain on utilise un autre SGBD que MySQL, certaines (SQL Server et Access pour ne citer qu'eux) ne respectent pas la norme ANSI, mais uniquement la norme SQL, qui ne fait aucun cas du caractère " \ ". Ainsi, on n'évite pas le SQL Injection, mais surtout, on ne peux pas échapper correctement les " ' ". Je me suis heurté à ce problème il y a quelques années, ou pour des raisons d'intégration dans un SI existant, un site initialement développé en MySQL a dû être basculé vers SQL Server. Ne connaissant pas PHP, mais étant présenté comme "Expert SQL Server", c'est bibi qui s'est tapé la migration. Seul hic, RIEN ne marchait. Impossible de piger ce qu'il se passait. J'ai passé deux jours avant de trouver ce putain de paramètre, évidement qui n'est visible que dans le fichier de config du serveur, auquel seul l'hébergeur avait accès.
 
Bref, ce truc est une honte, une horreur, le truc à éviter par tous les moyens.
 
Si je ne m'abuse, il était actif par défaut en PHP3, mais depuis le PHP4, les distributeurs du module se sont rendu compte de l'erreur, et ne l'active plus par défaut. C'est bien la preuve qu'il est recommandé de tout faire sauf l'activer. J'espère qu'un jour il sera purement et simplement supprimé. C'est un truc qui n'aurait jamais dû être créé.

Reply

Marsh Posté le 11-04-2007 à 10:34:57    

sinon, vu que tu passes par des requêtes paramétrées maintenant, désactive magicquote, car tu vas avoir le même problème que moi lors de ma migration vers SQL Server : les " \ " que magicquote ajoute partout vont t'emmerder

Reply

Marsh Posté le 11-04-2007 à 14:12:48    

Petit MAJ :  
 
IL semblerai que mon hebergeur n'utilise pas PHP 5 (pour mon hebergement) donc je doit laisser tomber PDO...
 
et autre probleme :  
 
mysql_real_escape_string ne passe pas ...
 
j'ai une erreur :  
Warning: mysql_real_escape_string(): Access denied for user: 'nobody@xxxx' (Using password: NO) in /home10/eq42432/html/test/page2.php on line 5
 
Warning: mysql_real_escape_string(): A link to the server could not be established in /home10/eq42432/html/test/page2.php on line 5
 
par contre mysql_esxape_string ça ça passe...
 
je fiat quoi maintenent... cry

Reply

Marsh Posté le 11-04-2007 à 14:25:58    

tu changes d'hébergeur :spamafote:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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