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

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Magic_quotes et conseil

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[PHP] Magic_quotes et conseil

n°1540694
lilougirl8
Posté le 10-04-2007 à 12:49:55  profilanswer
 

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]
 
 
 
 
 

mood
Publicité
Posté le 10-04-2007 à 12:49:55  profilanswer
 

n°1540719
Le_nain
Posté le 10-04-2007 à 13:33:33  profilanswer
 

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

n°1540736
Shinuza
This is unexecpected
Posté le 10-04-2007 à 14:14:03  profilanswer
 

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.
n°1540738
lilougirl8
Posté le 10-04-2007 à 14:14:15  profilanswer
 

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

n°1540742
Shinuza
This is unexecpected
Posté le 10-04-2007 à 14:18:58  profilanswer
 

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.
n°1540748
lilougirl8
Posté le 10-04-2007 à 14:23:00  profilanswer
 

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

n°1540786
lilougirl8
Posté le 10-04-2007 à 15:04:56  profilanswer
 

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

n°1540787
Shinuza
This is unexecpected
Posté le 10-04-2007 à 15:06:37  profilanswer
 

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.
n°1540789
lilougirl8
Posté le 10-04-2007 à 15:08:35  profilanswer
 

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

n°1540791
lilougirl8
Posté le 10-04-2007 à 15:09:23  profilanswer
 

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

mood
Publicité
Posté le 10-04-2007 à 15:09:23  profilanswer
 

n°1540792
lilougirl8
Posté le 10-04-2007 à 15:09:53  profilanswer
 

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

n°1540795
Shinuza
This is unexecpected
Posté le 10-04-2007 à 15:11:52  profilanswer
 

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.
n°1540797
lilougirl8
Posté le 10-04-2007 à 15:14:00  profilanswer
 

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

n°1540826
Shinuza
This is unexecpected
Posté le 10-04-2007 à 15:37:10  profilanswer
 

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.
n°1540832
masklinn
í dag viðrar vel til loftárása
Posté le 10-04-2007 à 15:41:28  profilanswer
 

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
n°1540837
soju
One shot !
Posté le 10-04-2007 à 15:49:36  profilanswer
 

masklinn a écrit :

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


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

n°1540838
MagicBuzz
Posté le 10-04-2007 à 15:55:54  profilanswer
 

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]

n°1540839
Shinuza
This is unexecpected
Posté le 10-04-2007 à 15:57:32  profilanswer
 

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.
n°1540842
LePhasme
Les Belges domineront le monde
Posté le 10-04-2007 à 16:00:06  profilanswer
 

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

n°1540843
Shinuza
This is unexecpected
Posté le 10-04-2007 à 16:01:39  profilanswer
 

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.
n°1540847
MagicBuzz
Posté le 10-04-2007 à 16:08:14  profilanswer
 

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:

n°1540854
Shinuza
This is unexecpected
Posté le 10-04-2007 à 16:20:43  profilanswer
 

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.
n°1540858
MagicBuzz
Posté le 10-04-2007 à 16:23:56  profilanswer
 

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)

n°1540864
Shinuza
This is unexecpected
Posté le 10-04-2007 à 16:30:45  profilanswer
 

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.
n°1540952
masklinn
í dag viðrar vel til loftárása
Posté le 10-04-2007 à 19:10:35  profilanswer
 

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
n°1540978
lilougirl8
Posté le 10-04-2007 à 20:07:32  profilanswer
 

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

n°1541036
lilougirl8
Posté le 10-04-2007 à 22:30:02  profilanswer
 

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
n°1541040
soju
One shot !
Posté le 10-04-2007 à 22:35:54  profilanswer
 

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

n°1541041
lilougirl8
Posté le 10-04-2007 à 22:39:07  profilanswer
 

...alors :D

n°1541044
Le_nain
Posté le 10-04-2007 à 22:43:34  profilanswer
 

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

n°1541045
Shinuza
This is unexecpected
Posté le 10-04-2007 à 22:43:46  profilanswer
 

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.
n°1541046
lilougirl8
Posté le 10-04-2007 à 22:44:14  profilanswer
 

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
n°1541050
Le_nain
Posté le 10-04-2007 à 22:47:45  profilanswer
 

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 ?

n°1541139
lilougirl8
Posté le 11-04-2007 à 09:25:08  profilanswer
 

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

n°1541152
Shinuza
This is unexecpected
Posté le 11-04-2007 à 10:03:33  profilanswer
 

C'"est de la merde, poubelle


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
n°1541156
lilougirl8
Posté le 11-04-2007 à 10:10:17  profilanswer
 

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

n°1541162
MagicBuzz
Posté le 11-04-2007 à 10:29:09  profilanswer
 

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

n°1541167
MagicBuzz
Posté le 11-04-2007 à 10:34:57  profilanswer
 

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

n°1541307
lilougirl8
Posté le 11-04-2007 à 14:12:48  profilanswer
 

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

n°1541314
MagicBuzz
Posté le 11-04-2007 à 14:25:58  profilanswer
 

tu changes d'hébergeur :spamafote:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  [PHP] Magic_quotes et conseil

 

Sujets relatifs
liens de menu en PHP[PHP] Test de recrutement
[Résolu] PHP MySQL - Problème de recherche dans la basePHP+SQL afficher 5 news et avoir accès aux autres...
Task Manager en PHPConseil choix techniques pour une refonte d'application
[PHP] preg_replace - Question sur la capture d'un pattern - Efficacité[PHP] Votre avis sur ma requete
[PHP] oscommerce - Login -> redirection et message d'accueil[PHP] Requete et SQL
Plus de sujets relatifs à : [PHP] Magic_quotes et conseil


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