Code php pour url rewriting : est ce la meilleur solution

Code php pour url rewriting : est ce la meilleur solution - PHP - Programmation

Marsh Posté le 13-02-2008 à 18:20:18    

Bonjour,
 
j'ai fait quelque recherche a ce sujet mais n'ai pas trouvé grand chose concernant le coté php de l'urlrewriting.
 
J'ai donc codé la page squelette suivante, en me basant sur des if file_exists;
est ce la meilleur solution ? merci
 
Donc a priori chaque page aurrait un fichier pages/pre-page.php
et un fichier pages/page.php
 
pre-page contiendra notamment le $titre et les fonctions a réaliser avant le code html.
 
Merci !
 
http://www.henol.fr/vrac/index.rar

Reply

Marsh Posté le 13-02-2008 à 18:20:18   

Reply

Marsh Posté le 13-02-2008 à 20:57:30    

Sinon il y a la version "si la page n'existe pas, ca plante", plus courte et moins de vérif donc plus rapide :
 

Code :
  1. <?php
  2. $db = mysql_connect('localhost', 'henol_henol', 'a27dec88mysql');
  3. mysql_select_db('henol_genealogie',$db);
  4. if ( empty($_GET['page']) )
  5. {
  6. $page = 'accueil';
  7. }
  8. else
  9. {
  10. $page = htmlentities($_GET['page']);
  11. }
  12. require 'pages/pre-'.$page.'.php';
  13. ?>
  14. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  15. <html xmlns="http://www.w3.org/1999/xhtml">
  16. <head>
  17.     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  18.     <meta name="keywords" content="test1,test2" />
  19.     <meta name="description" content="Ceci est un test." />
  20.     <title>Ouvoyager - <?php echo $titre ?></title>
  21.    
  22.     <link href="css/principal.css" rel="stylesheet" type="text/css" />
  23. <link href="css/<?php echo $page; ?>.css" rel="stylesheet" type="text/css" />
  24. <script type="text/javascript" src="js/principal.js"></script>
  25. <script type="text/javascript" src="js/<?php echo $page; ?>.js"></script>
  26. </head>
  27. <body>
  28. <?php
  29. require 'pages/'.$page.'.php';
  30. ?>
  31. </body>
  32. </html>
  33. <?php
  34. mysql_close($db);
  35. ?>

Message cité 1 fois
Message édité par Proxounet le 13-02-2008 à 21:09:30
Reply

Marsh Posté le 16-03-2008 à 11:47:53    

Proxounet a écrit :

Code :
  1. <?php
  2. $db = mysql_connect('localhost', 'henol_henol', 'a27dec88mysql');
  3. mysql_select_db('henol_genealogie',$db);
  4. if ( empty($_GET['page']) )
  5. {
  6. $page = 'accueil';
  7. }
  8. else
  9. {
  10. $page = htmlentities($_GET['page']);
  11. }
  12. require 'pages/pre-'.$page.'.php';
  13. ?>
  14. [...]



 

GET /?page=/../../../../etc/passwd HTTP/1.1


 
:)
 
Enfin s'dépend de la configuration du serveur, mais il peut y avoir des fichiers intéressants sur ton site, et puis c'est jamais bon de laisser ce genre de trucs.
 
htmlentities(), c'est pour inclure dans du code HTML, pas dans un chemin de fichier.
 
Pour les chemins, faut utiliser realpath() sur le chemin du fichier que tu veux utiliser, vérifier que realpath() te renvoit pas false (fichier inexistant -sauf sur xBSD, où, d'après le mode d'emploi de PHP, realpath ne renvoit pas false, si le répertoire du fichier existe), puis vérifier que le chemin renvoyé par realpath (qui est nettoyé des liens symboliques, et des "/../" ), mène bien au répertoire que tu veux (compare le début du chemin renvoyé par realpath, avec le chemin de ton répertoire, en oubliant pas de mettre un '/' à la fin des deux chaînes, si jamais t'as plusieurs répertoires avec le même début de nom, pour être sûr que seul le répertoire que tu veux, seras accepté).
 
 
Ton code est aussi vulnérable, si register_globals est activé sur le serveur Web que t'utilises (ce qui est souvent le cas, chez les hébergeur mutualisés, pour éviter les problèmes de compatibilité), si tu vérifies pas que t'inclus le bon fichier (qui va définir $titre).
 
Par exemple, on peut include ton fichier "/.htaccess" (ou n'importe quel fichier qui existera très vraisemblablement, genre "/robots.txt" ou "/favicon.ico" ). Vu qu'il ne définit pas $titre, on peut le définir depuis l'URL, et il sera utilisé dans ta page comme ça.
 

GET /?page=/../.htaccess&titre=</title><script>alert('Foo!'); HTTP/1.1


 
Le solution rapide, c'est d'initialiser toutes les variables que tu va utiliser directement. Dans ton cas, avant d'inclure ton pre-foo.php, rajoute un $titre = '';. Au cas où, il est aussi important d'utiliser htmlentities() à chaque fois que tu veux utiliser ta variable (pour être sûr de n'avoir rien oublié), quand elle n'est pas censée contenir de code HTML. Dans ton cas: <?php echo htmlentities($titre) ?>
 
(Et en passant, oublie pas que si t'utilises UTF-8, par exemple, faut rajouter le charset quand t'appelles htmlentities(), pour pas avoir de problèmes d'encodage... Regarde le mode d'emploi de cette fonctions, pour plus de détails).
 
 
Le lien vers ton archive rar ne marche plus, donc je sais pas si tu fais davantage de vérifications, dans cette autre version.
 
 
En général, si t'as qu'un nombre limité de pages, le plus simple est d'utiliser un switch(), et d'hardcoder les noms de pages. Au moins t'es sûr qu'on pourra pas inclure autre chose (ce qui ne veut pas dire que tu puisses ignorer les problèmes avec register_globals et htmlentities() parce que tu peux toujours oublier autre chose, un jour...).
 
 
[Edit: Ah, et puis t'es pas obligé d'utiliser ?page=Foo... Tu peux utiliser directement le chemin $_SERVER['REDIRECT_URL']. Dans ton "/.htaccess", rewrite simplement toutes les requêtes vers ton script PHP, sauf celles qui ne doivent pas passer par ce script ("/robots.txt", "/favicon.ico", tes images, tes feuilles de style, etc.).]
 
 
 
[Edit2:
 
Quelques détails, suite à ton message privé:
 
 
Pour ton site, le plus important à modifier, si tu veux enlever le "?page=" de tes URLs, ça sera les liens que t'as déjà crée... enfin si tu veux juste supprimer le "?page=", y'a des outils pour modifier les fichiers automatiquements, surtout si t'es sous Linux.
 
En interne, tu peux reprendre l'exact même système que t'as actuellement (en vérifiant mieux la sécurité, bien entendu, comme dit dans mon message).
 
Genre, dans ton .htaccess:
 


RewriteEngine on
 
RewriteCond %{REQUEST_URI} !^css/
RewriteCond %{REQUEST_URI} !^js/
RewriteRule ^.*$ /index.php?page=$0 [qsappend]


 
Ça va rediriger, par exemple "/présentation" vers "/index.php?page=présentation" (en interne, donc l'utilisateur verra que "/présentation", mais ton script PHP verra "/index.php?page=présentation" et pourra utiliser $_GET['page'], pour récupérer le nom de la page).
 
Le flag "qsappend" permet d'ajouter les arguments existants de l'URL, lors de la redirection (y compris "page", dans ton cas, si un utilisateur rajoute "?page=foo", donc il pourra y avoir deux fois "page" dans la query string... et PHP prendra en compte que le dernier, donc celui rajouté par l'utilisateur, plutôt que celui de ta redirection interne... enfin bon, l'utilisateur est pas censé faire ça, donc tu peux ignorer -enfin ça peut être un risque de phishing ou au moins de confusion, si quelqu'un s'amuse avec ça). Genre si l'utilisateur demande "/présentation?lang=en", ton script PHP recevra "/index.php?page=présentation&lang=en" (enfin c'est juste un exemple... s'pas bon de changer la langue comme ça, en guardant un nom de page en français :p).
 
Tu peux supprimer le flag, si t'utilises pas d'autres arguments, mais si tu le connais pas, ne l'oublies pas, au cas où tu t'en ais besoin un jour (enfin si t'as peu d'arguments, tu peux aussi les récupérer avec un RewriteCond sur QUERY_STRING... tout ça, c'est dans la doc de mod_rewrite).
 
 
]


Message édité par Ekuryua le 19-03-2008 à 15:30:20
Reply

Sujets relatifs:

Leave a Replay

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