changement aspect bouton menu

changement aspect bouton menu - PHP - Programmation

Marsh Posté le 23-09-2010 à 14:48:31    

Bonjour,
 
J'ai un site qui affiche des bouton pour le menu.
Quand j'affiche une page, je souhaiterais que le bouton du menu correspondant prenne un autre aspect parrapport aux autres boutons.
Si je défini les boutons et les pages en php dans un tableau, ça fonctionne :
 

Code :
  1. <?php
  2. $pages = array(
  3. 'accueil'=>'accueil.htm',
  4. 'humanitaire'=>'humanitaire.htm',..............);
  5. if(isset($_GET['page']) && array_key_exists($_GET['page'],$pages)){
  6. $inc = $pages[$_GET['page']];
  7. $active = $_GET['page'];
  8. }
  9. else{
  10. $inc = 'accueil.htm';
  11. $active = 'accueil';
  12. }
  13. echo '<div class="menu"><ul>
  14. <a class="bouton'.($active == 'accueil' ? 'active' : '').'" href="index.php?page=accueil.htm">Accueil</a><p>
  15. <a class="bouton'.($active == 'humanitaire' ? 'active' : '').'" href="index.php?page=humanitaire">L\'action humanitaire</a><p>...........
  16. echo '<div class="frame">';
  17. include($inc);
  18. echo '</div>';
  19. ?>


 
Mais si les les boutons et les pages sont issuent d'une base de donnée, j'y arrive pas  :(  :
 

Code :
  1. $select = 'SELECT * FROM menu ORDER BY id ASC';
  2. $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
  3. echo '<div class="menu">';
  4. while($row = mysql_fetch_array($result))
  5. {
  6. echo '<a class="bouton'.($active == '.$row[\'nom\'].' ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
  7. }
  8. echo '</div>';
  9. if(isset($_GET['lien']))
  10. {
  11. $inc = $_GET['lien'];
  12. $active = $_GET['nom'];
  13. }
  14. else
  15. {
  16. $inc = 'accueil.htm';
  17. $active = 'accueil';
  18. }
  19. echo '<div class="frame">';
  20. include($inc);
  21. echo '</div>';


 
Merci d'avance pour l'aide que vous pourriez mapporter.

Reply

Marsh Posté le 23-09-2010 à 14:48:31   

Reply

Marsh Posté le 23-09-2010 à 15:09:09    

t671 a écrit :


Code :
  1. $select = 'SELECT * FROM menu ORDER BY id ASC';
  2. $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
  3. echo '<div class="menu">';
  4. while($row = mysql_fetch_array($result))
  5. {
  6. echo '<a class="bouton'.($active == '.$row[\'nom\'].' ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
  7. }
  8. echo '</div>';
  9. if(isset($_GET['lien']))
  10. {
  11. $inc = $_GET['lien'];
  12. $active = $_GET['nom'];
  13. }
  14. else
  15. {
  16. $inc = 'accueil.htm';
  17. $active = 'accueil';
  18. }
  19. echo '<div class="frame">';
  20. include($inc);
  21. echo '</div>';


 
Merci d'avance pour l'aide que vous pourriez mapporter.


 
remplacer '.$row[\'nom\'].' par $row['nom'] ?

Reply

Marsh Posté le 23-09-2010 à 16:34:21    

czh a écrit :


 
remplacer '.$row[\'nom\'].' par $row['nom'] ?


 
Ca change rien ! J'ai essayé $row['nom'] et '$row['nom']', mais ça fonctionne pas !
 
J'ai l'impression que le $active n'est pas lu ????  :heink:

Reply

Marsh Posté le 23-09-2010 à 16:37:48    

A moins qu'il n'y ait d'autre surprise ailleurs/avant la ligne entière correcte est :
 
echo '<a class="bouton'.($active == $row['nom'] ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
 
Sinon tu peux diagnostiquer le problème à l'aide de :
 
echo $active;
echo $row['nom'];
var_dump($active == $row['nom']);
var_dump($active == $row['nom'] ? 'active' : '');
 
Edit: par exemple initialiser $active ($active = $_GET['nom']; / $active = 'accueil'; ) avant de l'utiliser.
 

Code :
  1. if(isset($_GET['lien']))
  2. {
  3. $inc = $_GET['lien'];
  4. $active = $_GET['nom'];
  5. }
  6. else
  7. {
  8. $inc = 'accueil.htm';
  9. $active = 'accueil';
  10. }
  11. $select = 'SELECT * FROM menu ORDER BY id ASC';
  12. $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
  13. echo '<div class="menu">';
  14. while($row = mysql_fetch_array($result))
  15. {
  16. echo '<a class="bouton'.($active == $row['nom'] ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
  17. }
  18. echo '</div>';
  19. echo '<div class="frame">';
  20. include($inc);
  21. echo '</div>';


 
ps: include($inc); c'est plutôt dangereux


Message édité par czh le 23-09-2010 à 16:50:55
Reply

Marsh Posté le 23-09-2010 à 17:52:53    

Voici donc pour résumer :
 

Code :
  1. $select = 'SELECT * FROM menu'; 
  2. $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() ); 
  3.  
  4. echo '<div class="menu">';
  5. if(isset($_GET['lien']))
  6. {
  7. $inc = $_GET['lien'];
  8. $active = $_GET['nom'];
  9. }
  10. else
  11. {
  12. $inc = 'accueil.htm';
  13. $active = 'accueil';
  14. }
  15.   while($row = mysql_fetch_array($result))
  16. {
  17.   echo '<a class="bouton'.($active == $row['nom'] ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
  18. }
  19. echo $active;
  20. echo $row['nom'];
  21. var_dump($active == $row['nom']);
  22. var_dump($active == $row['nom'] ? 'active' : '');
  23. echo '</div>';
  24. echo '<div class="frame">';
  25. include($inc);
  26. echo '</div>';


 
1) Qand j'ouvre le site, j'affiche donc la page "accueil", et l'onglet prend son aspect différent (donc ok). Cela est dû au  $inc = 'accueil.htm';
 $active = 'accueil';

Et les deux var_dump me donnent : accueilbool(false) et string(0) ""
2) Quand je clique ensuite sur un onglet, les deux "echo" (echo $active; et echo $row['nom'];) avant les var_dump ne donnent aucun résultat.
Et les var_dump donnent : bool(true) string(6) et "active".
 
D'après ce que j'en conclue, les variables $row['nom'] et $active sont vident (hormis pour la page initiale).
Pourtant, $row['nom'] s'affiche correctement dans l'onglet du menu !  :pt1cable:  
 
Qu'en penses-tu ? Quel est le remède à tout cela ?  :??:  
POur l'include, on verra après .....
 
Merci pour ton aide !

Reply

Marsh Posté le 23-09-2010 à 23:01:46    

C'est simple : quand tu écris tes balises <a> tu fais des liens du type :

echo "index.php?lien=".$LIEN


Ton menu est donc envoyé dans la variable $_GET["lien"];
Cette variable est récupérée en haut de ton script ligne 8, dans la variable $inc

 

Ton problème, c'est que dans ta boucle, tu ne teste pas $inc, mais $active !
C'est pour ça que ta condition de style ne marche pas.

Message cité 1 fois
Message édité par the_bigboo le 23-09-2010 à 23:02:39
Reply

Marsh Posté le 24-09-2010 à 17:18:35    

the_bigboo a écrit :

C'est simple : quand tu écris tes balises <a> tu fais des liens du type :

echo "index.php?lien=".$LIEN


Ton menu est donc envoyé dans la variable $_GET["lien"];
Cette variable est récupérée en haut de ton script ligne 8, dans la variable $inc
 
Ton problème, c'est que dans ta boucle, tu ne teste pas $inc, mais $active !
C'est pour ça que ta condition de style ne marche pas.


 
Là, je comprends pas trop ...... !?  :pt1cable:  

Reply

Marsh Posté le 25-09-2010 à 10:18:44    

Pour faire simple dans ton code, remplace à la ligne 19, $active, par $inc, et tu verras que ca va marcher.

Reply

Marsh Posté le 25-09-2010 à 14:10:26    

Code :
  1. if(isset($_GET['lien']))
  2. {
  3. $inc = $_GET['lien'];
  4. $active = $_GET['nom'];
  5. }


 
Bonjour le trou de sécu.


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 25-09-2010 à 17:09:38    

the_bigboo a écrit :

Pour faire simple dans ton code, remplace à la ligne 19, $active, par $inc, et tu verras que ca va marcher.


 
Ben non, ça fonctionne pas mieux !!!!!
Si tu regardes mon premier post, j'ai réussi à le faire en définissant le contenu du menu dans le script. Et ça foinctionne ......... !!!!!
Mais là, en définissant le menu dans une base de donnée, y'a pas moyen .......  :fou:

Reply

Marsh Posté le 25-09-2010 à 17:09:38   

Reply

Marsh Posté le 29-09-2010 à 18:29:14    

Bonjour à tous,
 
Au sujet de mon include($inc); , comment l'écrire pour éviter le "trou de sécurité" ?
 
Merci !


Message édité par t671 le 29-09-2010 à 18:29:40
Reply

Marsh Posté le 07-10-2010 à 11:27:57    

Il ne faut pas faire d'include à partir d'une variable passée dans une globale.

Reply

Marsh Posté le 07-10-2010 à 11:42:24    

La règle n° en sécurité et de ne JAMAIS avoir confiance en l'utilisateur.


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 07-10-2010 à 11:42:53    

the_bigboo a écrit :

Il ne faut pas faire d'include à partir d'une variable passée dans une globale.


 
heuuuuuuuuuuu .... oui .......  :pt1cable: , et encore ......
 
Comment rectifier l'existant ??

Reply

Marsh Posté le 07-10-2010 à 12:20:31    

A la limite même si c'est pas tip top, au moins tu peux faire :

Code :
  1. $lien = $_GET["lien"];
  2. switch ($lien){
  3.   case "valeur1":
  4.     $inc = "valeur1.php" ;
  5.   break ;
  6.   case "valeur2":
  7.     $inc = "valeur2.php" ;
  8.   break ;
  9.   case "valeur3":
  10.     $inc = "valeur3.php" ;
  11.   break ;
  12.   case "valeur4":
  13.     $inc = "valeur4.php" ;
  14.   break ;
  15.   default :
  16.     // Lien invalide
  17.   break ;
  18. }
  19. if (isset($inc)){
  20.   include($inc);
  21. }


L'idée, c'est que si je peux bidouiller ton url, je pourrais par exemple faire un truc du genre :

index.php.lien=/etc/passwd


Bon j'ose espérer que les serveurs de nos jours sont protégés contre ce genre d'injection... Mais si ce n'était pas le cas, je verrais des fichiers systèmes qui pourraient potentiellement me permettre d'accéder à ton serveur...

Reply

Marsh Posté le 07-10-2010 à 12:22:37    

Un première sécurité peut être :

Code :
  1. $pages_autorisees = array(
  2.     'accueil',
  3.     'non_autorise',
  4.     'page1',
  5.     'page2',
  6.     'page3'
  7. );
  8. $inc = 'accueil';
  9. if(isset($_GET['lien'])){
  10.     if(in_array($_GET['lien'],$pages_autorisees)){
  11.          $inc = $_GET['lien'];
  12.     }else{
  13.          $inc = 'non_autorise'
  14.     }
  15. }
  16. include($inc . '.php');


EDIT : grillé


Message édité par Paulp le 07-10-2010 à 12:23:26
Reply

Marsh Posté le 07-10-2010 à 14:26:22    

Ok et merci pour les propositions !  
 
Mais je ne peux pas définir les valeurs de $inc en faisant
$lien = $_GET["lien"];
switch ($lien){
  case "valeur1":
    $inc = "valeur1.php" ;
  break ;
  case "valeur2":
    $inc = "valeur2.php"...............

 
ou de $pages en faisant
1.$pages_autorisees = array(
   'accueil',
   'non_autorise',...............

 
Car les valeurs des pages à afficher sont dans une bd, et peuvent évoluer sans faire évoluer le script d'affichage du menu .

Reply

Marsh Posté le 07-10-2010 à 15:35:51    

A toi d'adapter pour que les propositions qu'on t'a faite soient adaptées sur un modèle :
 
Tu récupères tes valeurs depuis la BDD, et tu construis ta liste de liens autorisés sur le modèle que t'a fourni PaulP ;)

Reply

Marsh Posté le 07-10-2010 à 15:41:32    

La grande question est :
que se passe-t-il si on appelle index.php?lien=/etc/passwd ou index.php?lien=';DELETE FROM users;

Reply

Marsh Posté le 07-10-2010 à 15:55:39    

De ce que je vois il ne fait pas de requête SQL prenant des globales en compte. Niveau injection, ça a l'air bon.

Reply

Sujets relatifs:

Leave a Replay

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