Portable et moyen sûr d'obtenir le PATH_INFO
Je suis à la recherche d'un portable façon de recevoir le (très pratique) $_SERVER['PATH_INFO']
variable.
Après la lecture d'un certain temps, il s'avère PATH_INFO
est provenu de la CGI/1.1, et de ne pas toujours être présent dans l'ensemble de la configuration.
Quel est le meilleur (surtout de la sécurité) pour obtenir cette variable - en dehors de l'extraire manuellement (problème de sécurité).
bounty pour cogner.
Pourriez-vous préciser "portable?" PATH_INFO est fourni sainement par tous les moderne serveurs web. Certains anciens serveurs (IIS est un bien mauvais exemple) a eu des problèmes avec elle, mais vous ne devriez pas avoir un problème avec elle de nos jours sous des versions plus modernes de PHP qui corrigent les problèmes.
Certaines configurations de serveur, désactivez les variables données par l'interface CGI. J'ai vu un moderne (apache2.2) serveur web sans
Avez-vous juste besoin de la
En théorie, pourriez-vous avoir de fin du chemin d'être réécrit pour une variable que le script peut alors voir que $_['GET']?
Pourriez-vous préciser "portable?" PATH_INFO est fourni sainement par tous les moderne serveurs web. Certains anciens serveurs (IIS est un bien mauvais exemple) a eu des problèmes avec elle, mais vous ne devriez pas avoir un problème avec elle de nos jours sous des versions plus modernes de PHP qui corrigent les problèmes.
Certaines configurations de serveur, désactivez les variables données par l'interface CGI. J'ai vu un moderne (apache2.2) serveur web sans
PATH_INFO
.Avez-vous juste besoin de la
PATH_INFO
de scripts que front-end pour le client? Je veux dire, si vous avez un script qui est appelé à l'intérieur d'un script pour effectuer certains travaux, voulez-vous le path_info pour le script?En théorie, pourriez-vous avoir de fin du chemin d'être réécrit pour une variable que le script peut alors voir que $_['GET']?
OriginalL'auteur LiraNuna | 2009-12-10
Vous devez vous connecter pour publier un commentaire.
Bien, je suis (presque) sûr que sans faire usage de la
$_SERVER
superglobale clés, en fournissant une autre façon de comprendrePATH_INFO
est juste impossible, cela dit permet d'abord la liste de tous les $_SERVER clés que nous pouvons éventuellement utilisation:Nous avons évidemment besoin d'ignorer les deux derniers. Maintenant, nous devrions (je ne sais pas ce pour un fait, je suis juste en supposant que parce que vous l'avez dit) filtre toutes les clés qui existent dans le lien que vous avez fourni (qui BTW est en mode hors connexion ATM), qui nous laisse avec les touches suivantes:
Concernant votre commentaire Anthonys répondre:
Je suis en cours d'exécution LightTPD/1.4.20-1 (Win32) PHP 5.3.0 CGI,
cgi.fix_pathinfo = 1
et$_SERVER['REQUEST_URI']
est très disponible pour moi, je me souviens aussi d'utiliser cette même variable à l'époque où personne n'utilisaitmod_rewrite
donc mon honnête, humble suppose que vous vous êtes simplement faux dans ce point. Concernant laSCRIPT_FILENAME
clé, je suis incapable de test que l'on sort de l'ATM. Encore, si l'on ferme les yeux très fort et croire que vous êtes de droite qui nous laisse avec une seule variable:Je ne cherche pas à être dur ici (et je crois toujours qu'il y a plus de solutions), mais si
PHP_SELF
est la seule clé que vous souhaitez que nous travaillons avec (s'il n'y a pas de contraintes surPHP_SELF
lui-même) il y a une seule solution:Cette fonction devrait fonctionner, cependant il peut y avoir quelques problèmes à l'aide de la
__FILE__
constante depuis il renvoie le chemin d'accès du fichier dans lequel le__FILE__
constante est déclarée et non pas le chemin d'accès à la demande de script PHP, c'est pourquoi le $whatToUse est là pour: sou vous pouvez remplacer par'SCRIPT_FILENAME'
ou si vous croyez vraiment en ce que vous dites, suffit d'utiliser'.php'
.Vous devez également lire à ce sujet pourquoi ne pas utiliser
PHP_SELF
.Si cela ne fonctionne pas pour vous, je suis désolé mais je ne peux penser à rien d'autre.
MODIFIER - un peu plus de lecture pour vous:
REQUEST_URI
est Apache spécifique?)PHP_SELF
etPATH_INFO
etSCRIPT_NAME
etREQUEST_URI
REQUEST_URI
est de mod_rewrite, c'est pourquoi il est apache spécifiques.Alors comment expliquez-vous que j'ai le REQUEST_URI variable sur LigHTTPD?
lighttpd a mod_rewrite équivalent? Les deux sont open source, vous le savez - je parie qu'ils partagent du code.
"Vous devriez lire ceci concernant les raisons de ne pas utiliser
PHP_SELF
." - Cela dit de ne pas utiliserPHP_SELF
à écrire des trucs sur la page. Je passer l'information autour de et de le vérifier.La seule modules que j'ai sur lighttpd sont: mod_access, mod_cgi, mod_dirlisting, mod_indexfile, mod_mimetype et mod_staticfile. De toute façon, il n'est pas Apache spécifiques.
OriginalL'auteur Alix Axel
Je pense que c'est ici une astuce pour obtenir "path_info" d'une autre manière:
Par exemple, l'accès à une URL comme: http://somehost.com/index.php/some/path/here, la valeur de
$path_info
serait:"/some/path/here"
Il a travaillé pour moi dans les différents serveurs apache en cours d'exécution sur windows et linux, mais je ne suis pas sûr à 100% si c'est "safe" et "portable", ovbiously je n'ai pas tester dans "TOUS" les serveurs de configs, mais semble fonctionner...
OriginalL'auteur Sahib J. Leo
Edit: sans SCRIPT_NAME, et en supposant que vous avez DOCUMENT_ROOT (ou pouvez définir/découvrir par vous-même) et en supposant que vous avez SCRIPT_FILENAME:
Aussi @ Anthony (pas assez de rep à commenter, désolé): à l'Aide de str_replace() va correspondre à n'importe où dans la chaîne. Il n'est pas garanti pour fonctionner, vous voulez seulement au début. Aussi, votre méthode de seulement 1 barre oblique arrière (via strrpos) pour déterminer SCRIPT_NAME, ne fonctionnera que si le script est sous la racine, qui est pourquoi vous êtes mieux de comparaison script_filename contre docroot.
Avez-vous même de le vérifier? C'est cassé, pour de nombreuses raisons.
oui je l'ai fait vérifier. j'ai laissé de côté le délimiteur argument lors du collage en soi, mais parce que je pensais que c', par défaut,/, apparemment pas. de quelles autres façons est-il cassé?
Je comprends les deux de vous essayez d'aider, mais j'ai vraiment besoin d'un portable.
Eh bien, je ne peux pas parler pour IIS, mais dans nginx personnellement, je exposer script_name, script_filename request_uri, etc. via fastcgi_param. La même chose est possible pour lighttpd. De toute façon, pour en revenir sur le sujet: PATH_INFO est la différence entre le nom du script de traitement de la demande, et la pleine http chemin d'accès demandé. Vous aurez besoin soit de découvrir ou de définir les éléments de la calculer.
OriginalL'auteur oops
Cela dépend de la définition de "portable" et "sûr".
Permettez-moi de voir si j'ai bien compris:
1) Vous n'êtes pas intéressé à la CLI:
2) Vous voulez avoir PATH_INFO dans tous les OS + serveur HTTP + PHP combinaison:
Hmmm... PHP_INFO, dans la variable $_SERVER tableau, est fournie par PHP à un script dans l'exécution que dans certaines conditions, selon les logiciels mentionnés ci-dessus. Il n'est pas toujours disponible. Le même est vrai pour l'ensemble de l' $_SERVER tableau!
En bref: "$_SERVER dépend du serveur"... donc une solution portable ne peut pas relayer sur $_SERVER... (juste pour donner un exemple: nous avons un tutoriel pour configurer PHP/CGI $_SERVER variables sur NginX serveur HTTP à kbeezie.com/view/php-self-path-nginx/)
3) Malgré ce qui a été mentionné ci-dessus, c'valeurs de mentionner que si nous avons en quelque sorte l'URL complète qui a été demandé disponible comme une chaîne de caractères, il est possible d'obtenir le PATH_INFO de par l'application d'expressions régulières et d'autres PHP les fonctions de chaîne, en toute sécurité (également de la validation de la chaîne d'entrée comme une URI valide).
Donc, pourvu que nous ayons la chaîne d'URL... alors OUI, NOUS AVONS un ordinateur portable et un moyen sûr de déterminer PATH_INFO.
Maintenant, nous avons deux clair et ciblé questions de mise en œuvre:
Parmi plusieurs possibilités, voici une démarche possible:
Comment faire pour obtenir l'URL?
1) Avec votre profonde et complète des connaissances sur chaque serveur HTTP + OS + la version de PHP combinaison, vérifier et essayer toutes les possibilités pour obtenir l'URL à partir de la valeur de $_SERVER array (vérifier 'PHP_SELF', 'QUERY_STRING', 'SCRIPT_FILENAME', 'PATH_TRANSLATED', 'SCRIPT_NAME', 'REQUEST_URI', 'PATH_INFO', 'ORIG_PATH_INFO', 'HTTP_HOST', 'DOCUMENT_ROOT' ou quoi que ce soit)
2) Si l'étape précédente a échoué, faire le script PHP de retour d'un code javascript qui envoie du document".URL" informations de retour. (La portabilité du numéro transféré à côté client.)
Comment faire pour obtenir le PATH_INFO à partir de l'URL?
Ce code lié ici.
C'est mon humble avis et d'approche du problème.
Qu'en pensez-vous?
$_SERVER
variables sont sûrs à utiliser. PHP_SELF par exemple, est basé sur l'URL. Voir markjaquith.wordpress.com/2009/09/21/...OriginalL'auteur J. Bruni
Je n'ai pas vu les commentaires ou sur le lien avant de poster. Voici quelque chose qui pourrait fonctionner, basé sur ce que la page mentionnée ci-dessus donne comme CGI-variables dérivées:
SCRIPT_NAME
etREQUEST_URI
ne sera pas disponible siPATH_INFO
n'est pas défini.URL de la requête n'est pas mentionné sur cette page, vous avez indiqué plus tôt...
Pouvez-vous veuillez fournir une liste de variables globales qui sont fournis? N'importe quel d'entre eux incluent déjà le chemin de l'info tout simplement pas dans un facile de la forme de l'extrait?
Ok. Je pense oups et moi sommes tous les deux en train d'être vraiment utile et bon sport à propos de votre situation, mais c'est vraiment impoli de continuer à pointent vers la même page, comme s'il était la source ultime, et d'agir comme si nous sommes stupides pour offrir des solutions qui ne PAS utiliser de variables globales inscrites à la même page. Il serait très utile si vous pouvez effectuer les opérations suivantes à partir du même répertoire que votre gênants script vit à:
créer une page appelée "globaltest.php" "phpinfo();" dans le script. Ouvrir "yourserver.org/globaltest.php/stuff". Fournir une liste de toutes les variables qui comprennent "globaltest.php" ou "globaltest.php/stuff". Si AUCUNE des variables de faire toute référence à "/stuff", alors je ne vois pas comment vous vous attendez à extraire en quelque sorte, sécuritaire ou dangereux, à partir de votre script.
OriginalL'auteur Anthony
vous pouvez essayer de
PATH_INFO
est défini par le serveur. Il peut ne pas toujours être là, pas d'importance si elle est accessible par_ENV
ou_SERVER
.Inutile de dire que
_ENV
ne contient même pas que des biens.OriginalL'auteur streetparade