2009-06-11 12 views
17

Existe-t-il un moyen simple d'identifier le fichier traitant initialement la requête, en ignorant les arguments get et en gérant les mappings (au moins basiques) comme / à /index.php?Comment identifier la page demandée en PHP

Idéalement ce que je cherche est quelque chose comme $_SERVER['REQUEST_URI'], sauf qu'il retourne la même valeur indépendamment des arguments get et cette valeur est le fichier demandé, pas l'URI, ni le fichier en cours d'exécution ($_SERVER['PHP_SELF']). En d'autres termes, un $_SERVER['REQUESTED_FILE'] ou quelque chose. Je n'ai rien vu de tel. Existe-t-il ou dois-je écrire quelque chose manuellement?

Mise à jour Voici quelques exemples d'URL jumelés avec ce que je voudrais que le résultat soit:

example.com/mypage.php  : /mypage.php 
example.com/     : /index.php 
example.com/foo/?hello=world : /foo/index.php 

Et ces valeurs de retour sont vraies même dans les fichiers inclus. Voir ma réponse ci-dessous avant de répondre, je pense que j'ai trouvé ce que je cherchais.

+0

Pouvez-vous mettre à jour votre question et ajouter un exemple hypothétique de ce que vous cherchez? Il n'est pas clair si vous êtes intéressé par l'URL de demande (http://example.org) ou le fichier qui est utilisé pour servir la demande (/var/www/.../index.php) – Shoan

Répondre

23

j'ai décidé de le tester moi-même. La variable $_SERVER['SCRIPT_NAME'] sert le chemin vers le fichier demandé, même s'il s'agit d'un fichier d'index, et sans avoir de paramètres ou quoi que ce soit d'autre. La documentation PHP indique que ceci contient le chemin du fichier, mais il semble être relatif à la racine du document, tout comme PHP_SELF, mais sans la faille de sécurité.

Voici le code que je l'habitude de tester ceci: https://gist.github.com/dimo414/5484870

La sortie lors de la demande example.com/?foo=bar:

__FILE__:    /var/www/index.php 
PHP_SELF:    /index.php 
SCRIPT_NAME:   /index.php 
REQUEST_URI:   /?foo=bar 
parse_url(REQUEST_URI):/


__FILE__:    /var/www/pathtest.php 
PHP_SELF:    /index.php 
SCRIPT_NAME:   /index.php 
REQUEST_URI:   /?foo=bar 
parse_url(REQUEST_URI):/

Et la sortie lors de la demande example.com/index.php/<strong>XSS</strong>:

__FILE__:    /var/www/index.php 
PHP_SELF:    /index.php/XSS # note the XSS exploit (this is bold in browser) 
SCRIPT_NAME:   /index.php  # No exploit here 
REQUEST_URI:   /index.php/%3Cstrong%3EXSS%3C/strong%3E 
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E 


__FILE__:    /var/www/pathtest.php 
PHP_SELF:    /index.php/XSS 
SCRIPT_NAME:   /index.php 
REQUEST_URI:   /index.php/%3Cstrong%3EXSS%3C/strong%3E 
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E 

Comme vous pouvez le voir , $_SERVER['SCRIPT_NAME'] retourne toujours le fichier qui a traité la requête, c'est-à-dire le fichier dans l'URL, éviter tout risque XSS.

+0

Il est intéressant de noter que si vous utilisez une sorte de MVC ou une méthode de contrôleur frontal puis "SCRIPT_NAME" retournera le script qui a fourni l'include, donc si tout tourne à travers l'exemple index.php c'est ce qui reviendra - dans ce cas $ _SERVER ['REQUEST_URI'] semble faire l'affaire. –

+2

@MatthewRiches Notez que 'REQUEST_URI' sert un objectif différent de 'SCRIPT_NAME' - le premier est l'URI demandée par l'utilisateur, y compris les paramètres GET, où' SCRIPT_NAME' ne le fait pas intentionnellement car il s'agit d'un chemin sur le serveur. Si vous travaillez dans une bibliothèque MVC, vous devez consulter la documentation de la bibliothèque pour savoir comment identifier le fichier réellement demandé. – dimo414

-1

Sa très vieille question et pas très claire aussi. Ce que j'ai compris, c'est que vous voulez savoir quelle page envoie la requête GET/POST.Cela peut être mis en œuvre par:

$ _SERVER [ 'HTTP_REFERER']

Maintenant, pour obtenir le nom réel de la page, écrire comme: = basename ($ _ SERVER [ 'HTTP_REFERER']);

Cela vous résoudra problème.

+0

Non, la question ne pose aucune question sur le référent HTTP. Cela indiquerait (quand il est défini) à quelle page l'utilisateur se trouvait précédemment et qui les a référés à cette page. La question demande le fichier actuellement demandé, et la réponse acceptée montre qu'il s'agit de $ _SERVER ['SCRIPT_NAME'] '. – dimo414

0

Aller chercher le nom de fichier de l'URL demandée utiliser le code suivant.

basename($_SERVER['URL']); 
basename($_SERVER['REQUEST_URI']); 
basename($_SERVER['SCRIPT_NAME']); 
basename($_SERVER['SCRIPT_FILENAME']); 
basename($_SERVER['REQUEST_URI']); 
basename($_SERVER['PATH_TRANSLATED']); 
basename($_SERVER['PHP_SELF']); 

une utilisation tout tous ceux de la nichée si la condition pour que vous ne manquerez pas le nom du fichier toute façon.

+0

Cela n'a rien à voir avec la question. – dimo414

Questions connexes