Quel est le problème avec l'aide de $_REQUEST[]?
J'ai vu un certain nombre de postes d'ici disent de ne pas utiliser le $_REQUEST
variable. J'ai l'habitude de ne pas, mais parfois, c'est pratique. Quel est le problème avec elle?
- Voir la question et les réponses: stackoverflow.com/questions/1149118/...
- Depuis php 5.3 la valeur par défaut de php.ini dit qu'données GET et POST sont mis en
$_REQUEST
. Voir php.net/request_order je viens de tombé sur cette rétro-compatibilité pause lorsque attend les données de cookie pour être en$_REQUEST
et vous demandez-vous pourquoi elle n'avait pas de travail! De sorte que la plus grande raison pour éviter d'utiliser $_REQUEST est maintenant que votre script ne peut pas définirrequest_order
lui-même (il estPHP_INI_PERDIR
), donc un php.ini changement peut facilement se casser les hypothèses votre script est construit. Mieux mettre ces hypothèses directement dans votre script.
Vous devez vous connecter pour publier un commentaire.
Il n'y a absolument rien de mal avec la prise de participation de deux
$_GET
et$_POST
de façon combinée. En fait c'est ce que vous avez presque toujours envie de faire:un simple idempotent demande généralement soumis par GET, il y a la possibilité de la quantité de données que vous souhaitez ne rentre pas dans une URL de sorte qu'il a d'être muté à un POSTE de la demande plutôt que comme une question pratique.
pour une demande qui a un effet réel, vous devez vérifier qu'il est présenté par la méthode POST. Mais la façon de le faire est de vérifier
$_SERVER['REQUEST_METHOD']
explicitement, ne pas compter sur$_POST
étant vide d'un GET. Et de toute façon si la méthode estPOST
, vous pourriez encore envie de prendre certains paramètres de requête de l'URL.Non, le problème avec
$_REQUEST
a rien à voir avec l'amalgame entre GET et POST paramètres. C'est qu'elle aussi, par défaut,$_COOKIE
. Et les cookies ne sont pas vraiment comme la soumission d'un formulaire de paramètres à tous: que vous presque jamais envie de le traiter comme la même chose.Si vous avez accidentellement obtenir un cookie placé sur votre site avec le même nom que l'un de vos paramètres de formulaire, puis les formes qui dépendent de ce paramètre va mystérieusement cesser de fonctionner correctement en raison de la valeur du cookie substituant les paramètres attendus. C'est très facile à faire si vous avez plusieurs applications sur le même site, et peuvent être très difficiles à déboguer quand vous avez juste un couple d'utilisateurs avec les anciens cookies vous n'utilisez pas plus de traîner et de briser les formes de façons personne ne peut reproduire.
Vous pouvez changer ce comportement pour le beaucoup plus judicieux
GP
(pas deC
) commande avec le request_order config de PHP 5.3. Lorsque cela n'est pas possible, personnellement, je voudrais éviter de$_REQUEST
et, si j'avais besoin d'un combiné OBTENIR+après tableau, le créer manuellement.a="foo"
et $_COOKIEa="bar"
, alors il n'y aura aucune override/conflits ici?J'ai été fouiller dans certains messages du forum sur PHP Internals et trouvé une discussion intéressante sur le sujet. Le thread initial était quelque chose d'autre, mais une remarque par Stefan Esser, un (si ce n'est la) spécialiste de la sécurité dans le monde PHP tourné la discussion vers les implications sur la sécurité de l'utilisation de $_REQUEST pour quelques postes.
Citant Stefan Esser PHP Internals
et dans un plus tard, de répondre à la même thread
La discussion se poursuit pendant un peu plus d'affichages, et est intéressant à lire.
Comme vous pouvez le voir, le principal problème avec $_REQUEST n'est pas tellement qu'il a données à partir de $_GET et $_POST, mais aussi à partir de $_COOKIE. Certains autres gars sur la liste proposé de modifier l'ordre dans lequel $_REQUEST est rempli, par exemple, remplir avec de l' $_COOKIE premier, mais cela pourrait conduire à de nombreux autres problèmes potentiels, par exemple avec le gestionnaire de Session.
Vous pourriez complètement omettre $_COOKIES de l' $_REQUEST mondiale, cependant, de sorte qu'il n'est pas remplacé par l'un des autres tableaux (en fait, vous pouvez le limiter à une combinaison quelconque de ses contenus standard, comme le Manuel PHP sur le variable_order paramètre ini nous dit:
Mais là encore, vous pouvez aussi envisager de ne pas utiliser $_REQUEST tout à fait, simplement parce qu'en PHP, vous pouvez accéder à l'Environnement, Get, Post, Cookie, et le Serveur dans leur propre globals et ont un vecteur d'attaque en moins. Vous avez encore de désinfecter ces données, mais il est une chose de moins à se soucier.
Maintenant, vous pourriez vous demander, pourquoi ne $_REQUEST existe après tout, et pourquoi il n'est pas supprimé. Cela a été demandé sur PHP Internals ainsi. Citant Rasmus Lerdorf sur Pourquoi ne $_REQUEST existent? sur PHP Internals
De toute façon, l'espoir que de jeter un peu de lumière.
$_REQUEST
se réfère à toutes sortes de requêtes (GET, POST, etc..). C'est parfois utile, mais il est généralement préférable de spécifier la méthode exacte ($_GET, $_POST, etc).$_REQUEST
est généralement considéré comme nocif pour la même raison que le simple moyen de la complexité des données-les transformations sont souvent effectuée dans le code de l'application au lieu d'déclaré dans SQL: certains programmeurs sucer.En tant que tel, si l'on a tendance à utiliser des
$_REQUEST
partout, je ne peux rien faire par GET que je pourrais par la POSTE, ce qui implique la mise en place<img>
tags sur mon (malveillant) site qui causent les utilisateurs connectés à votre module e-commerce pour l'achat de produits en silence, ou je peut les amener à cliquer sur les liens qui se traduiront en actions dangereuses ou la révélation d'informations sensibles (probablement pour moi).Cependant, c'est en raison d'un novice, ou au moins inexpérimenté, programmeur PHP faisant de simples erreurs. Tout d'abord, savoir quand des données de ce type est approprié. Par exemple, j'ai un service web qui peut renvoyer des réponses dans l'Encodage, XML ou JSON. L'application décide de la façon de formater la réponse en cochant la HTTP_ACCEPT en-tête, mais peut être contraint à un particulier par l'envoi de la
format
paramètre.Lors de la vérification du contenu du paramètre de format, il pourrait être envoyés par l'intermédiaire de la chaîne de recherche ou un postdata, en fonction d'une multitude de facteurs, dont le moindre n'étant de savoir si ou non les applications d'appels veut", &format=json" mélangé à sa demande. Dans ce cas,
$_REQUEST
est très pratique car il me permet d'économiser avoir à écrire quelque chose comme ceci:Je ne vais pas radoter sur beaucoup plus loin, mais il suffit de dire que
$_REQUEST
utilisation n'est pas dissuadé, car il est intrinsèquement dangereux - c'est juste un autre outil qui fait exactement ce qui est demandé, si vous comprenez ces conséquences ou pas -, c'est le mauvais, paresseux ou non informés de la décision de mauvais, paresseux ou inexpérimentés programmeur qui provoque ce problème.Comment utiliser
$_REQUEST
en toute sécuritéaddslashes()
ou*_escape_string()
. Allez le montrer à l'utilisateur?htmlentities()
ouhtmlspecialchars()
. Attend de données numériques?is_numeric()
ouctype_digit()
. En fait,filter_input()
et ses fonctions sont conçues pour ne rien faire, mais de vérifier et de les désinfecter les données. L'utilisation de ces outils, toujours.$post_clean
. Alternativement, vous pouvez simplement nettoyer directement dans les superglobales, mais la raison pour laquelle je préconise, à l'aide d'une variable distincte est parce que cela les rend faciles à repérer les vulnérabilités dans le code, comme rien pointant directement vers une superglobale et pas ses épurés équivalente est considérée comme une dangereuse erreur.En conclusion, n'oubliez pas cette règle simple:
LA SÉCURITÉ EST CE QUE VOUS EN FAITES, LES GENS!
EDIT:
Je fortement recommander bobince conseils: si vous le pouvez, régler le
request_order
paramètre en php.ini pour "GP"; qui est, sans aucun cookie composant. Il n'y a presque aucun raisonnement rationnel dans 98% des cas, que les données de cookie ne devrait jamais être considéré comme comparable à la chaîne de requête ou postdata.P. S., Anecdote!
Je connaissais un programmeur qui a pensé à
$_REQUEST
un lieu de simplement stocker des données était accessible dans une superglobale façon. Important les noms d'utilisateur et mots de passe, les chemins d'accès aux fichiers, vous le nom et il a été stocké dans$_REQUEST
. Il était un peu surpris (mais pas comique, c'est le cas, malheureusement) quand je lui ai dit comment cette variable se comporte. Inutile de dire que la pratique a été déposé.OBTENIR les demandes doivent être idempotent et après les demandes sont généralement pas. Cela signifie que les données dans
$_GET
et$_POST
doit généralement être utilisé de différentes manières.Si votre application utilise des données provenant de
$_REQUEST
, il va se comporter le même pour les deux GET et POST demandes, ce qui viole l'idempotence de l'OBTENIR.C'est vague. Vous n'avez pas vraiment savoir comment les données pour vous car il porte post, get, et les données de cookie. Je ne pense pas nécessairement que c'est toujours une mauvaise chose, à moins que vous besoin de savoir ou de restreindre la méthode de livraison.
En fait, j'aime l'utiliser. Il vous donne la flexibilité d'utiliser GET ou POST, qui peuvent venir dans maniable pour des choses comme la recherche de formes où la plupart du temps les données sont Affichées, mais parfois, vous aurez envie de dire lien vers une recherche particulière, de sorte que vous pouvez utiliser les paramètres GET à la place.
Aussi, si vous regardez de nombreuses autres langues (ASP.NET par exemple), ils ne font aucune distinction entre GET et POST variables au tout.
ETA:
Je n'ai jamais utilisé de DEMANDE pour obtenir la valeur du COOKIE, mais je pense que Kyle bout à bout fait un grand point dans les commentaires sur ce post à ce sujet. Ce n'est PAS une bonne idée d'utiliser la DEMANDE pour obtenir la valeur du COOKIE. Je crois qu'il est juste qu'il y a du réel potentiel pour le cross-site request forgery si vous faites cela.
Aussi, l'ordre dans lequel les choses se charge en DEMANDE est contrôlé par les paramètres de configuration de php.ini (variables_order et request_order). Donc, si vous avez la même variable sont passées par POST et GET, ce qui en fait l'un pénètre dans la DEMANDE dépend de ces paramètres ini. Cela pourrait affecter la portabilité si vous dépendez d'un ordre particulier et ces paramètres sont configurés différemment que vous vous attendez à être.
Il est important de comprendre quand utiliser POST, quand les utiliser et OBTENIR lors de l'utilisation d'un cookie. Avec $_REQUEST, la valeur que vous êtes à la recherche à la peut venir de l'un d'eux. Si vous prévoyez d'obtenir la valeur d'un POST ou un GET ou à partir d'un COOKIE, c'est plus instructif à quelqu'un de lire votre code pour utiliser la variable spécifique au lieu de $_REQUEST.
Quelqu'un d'autre a fait remarquer également que vous ne voulez pas tous les POSTES ou les cookies pour être remplacée par l'Obtient parce qu'il y a différentes cross-site de règles pour chacun d'eux, par exemple, si vous revenez de données ajax tout en utilisant $_REQUEST, vous êtes vulnérable à un cross site script d'attaque.
La seule fois à l'aide de
$_REQUEST
n'est pas une mauvaise idée consiste à OBTENIR.Et même avec GET,
$_GET
est plus court à taper que$_REQUEST
😉$_POST
quand il est important que les données soient POSTDATA. On devrait utiliser$_REQUEST
lorsque les données agnostiques pour le Verbe HTTP utilisée. On devrait dans tous ces cas désinfecter soigneusement toutes les données d'entrée.J'ai peut être utilisée que si vous souhaitez récupérer l'url ou le nom d'hôte, mais pour, en fait, l'analyse des données à partir de l'URL comme parmeters en utilisant le & symbole, il est probablement pas une bonne idée. En général, vous ne voulez pas utiliser une vague description de ce que vous essayez de faire. Si vous avez besoin d'être précis, d'où $_REQUEST est mauvais, si vous n'avez pas besoin d'être précis, alors n'hésitez pas à l'utiliser. Je ne le pense.
$_REQUEST
avec$_SERVER['QUERY_STRING']
?Si vous savez ce que les données que vous souhaitez, vous devez le demander explicitement. OMI, GET et POST sont deux animaux différents et je ne peux pas penser à une raison pour laquelle vous avez besoin de mélanger les données post et les chaînes de requête. Si quelqu'un a un, je serais intéressé.
Il peut être pratique d'utiliser $_REQUEST lors de vos scripts peuvent répondre soit GET ou POST de la même manière. Je dirais tout de même que ce doit être un cas extrêmement rares, et dans la plupart des cas, les deux fonctions distinctes pour gérer les deux concepts distincts, ou à tout le moins, la vérification de la méthode et de la sélection de la bonne variables, est préféré. Le flux de programme est généralement beaucoup plus facile à suivre quand il n'est pas nécessaire de croiser où les variables pourrait être à venir à partir de. Être le genre de la personne qui a à maintenir votre code en 6 mois de temps. Il pourrait être vous.
En plus des problèmes de sécurité et de WTFs causés par les cookies et les variables d'environnement dans la variable REQUEST (ne me lancez pas sur MONDIAL), pensez à ce qui pourrait arriver dans l'avenir si PHP a commencé supportant nativement d'autres méthodes telles que PUT et DELETE. Alors qu'il est extrêmement peu probable que celles-ci seraient fusionnées dans la DEMANDE superglobale, il est possible qu'il puisse être compris comme une option dans le variable_order réglage. Si vous avez vraiment aucune idée que ce soit ce que la DEMANDE contient, et ce qui est en train de priorité, en particulier si votre code est déployé sur un serveur tiers.
POST est plus sûr que de l'OBTENIR? Pas vraiment. Il est préférable d'utiliser les OBTENIR, si possible, car il est plus facile de voir dans les journaux de votre façon dont votre application est exploitée lorsqu'il est attaqué. POST est mieux pour les opérations qui affectent le domaine de l'état parce que les araignées n'ont généralement pas les suivre, et prédictive de l'extraction de mécanismes de ne pas supprimer la totalité de votre contenu lorsque vous ouvrez une session dans votre CMS. Cependant, la question n'était pas sur le bien-fondé de GET vs POST, c'était sur la façon dont le récepteur doit traiter les données entrantes et pourquoi c'est mauvais pour la fusionner, donc c'est vraiment juste une BTW.
Je pense qu'il n'y a pas de problème avec
$_REQUEST
, mais il faut être prudent lors de son utilisation car il est une collection de variables à partir de 3 sources (GPC).Je suppose que
$_REQUEST
est toujours disponible pour rendre les anciens programmes compatibles avec les nouvelles versions de php, mais si nous lancer de nouveaux projets (y compris les nouvelles bibliothèques) je pense que nous ne devrions pas utiliser$_REQUEST
plus pour rendre les programmes plus clair. Nous devrions même envisager de supprimer les utilisations de$_REQUEST
et la remplacer par une fonction wrapper pour rendre le programme plus léger, en particulier dans le traitement de grandes soumis des données de texte, depuis$_REQUEST
contient des copies de$_POST
.Wow... juste eu certains de mes scripts d'arrêt de travail en raison d'une la mise à niveau vers PHP 5.3. Fait la même chose: supposons que les cookies peut être défini lors de l'utilisation de la
$_REQUEST
variable.Avec la mise à jour exactement qui a cessé de fonctionner.
J'appelle maintenant la valeur du cookie séparément à l'aide d'
$_COOKIE["Cookie_name"]
...Le problème central, c'est qu'il contient des cookies, comme d'autres l'ont dit.
En PHP 7, vous pouvez le faire:
Cela évite les problèmes avec les cookies et vous donne, au pire, un tableau vide et, au mieux, une fusion de $_GET et $_POST avec ce dernier qui prévaut. Si vous n'êtes pas trop ennuyé avec permettant URL injection de paramètres par le biais de la chaîne de requête, c'est assez pratique.
Il est très précaire. Aussi, il est maladroit car vous ne savez pas si vous allez avoir un POST ou un GET ou d'une autre demande. Vous devriez vraiment savoir la différence entre eux lors de la conception de vos applications. OBTENEZ est très précaire, car il est passé dans l'URL et n'est pas adapté pour presque rien en plus de la page de navigation. POST, alors que pas sûr par elle-même, offre un niveau de safetey.
$_POST
et$_GET
.GET
est d'insécurité "comme il est passé dans l'URL". Je pense que vous manquez le point de l'ensemble. Il n'y a pas de différence entre$_GET
ou$_POST
. Il n'importe pas si vous pouvez voir les paramètres ou pas. Dans les deux cas, vous pouvez altérer eux. D'ailleurs, aujourd'hui, le navigateur de saisie semi-automatique près de chaque entrée. Même si vous pensez à envoyer des noms d'utilisateur/mots de passe ou d'autres informations sensibles par le biais de l'URL que nous avons pour mettre fin à cette discussion.POST
paramètres sera complété automatiquement(Chrome 35.0.1916.114 m).$_GET
est pour une page dynamique du système(avec un.htaccess
) ou pour des raisons SEO.... provides one level of safetey.
Ce n'est pas vrai. C'est peut-être plus difficile de voir qu'une$_GET
, mais j'en doute. Si vous êtes un pirate informatique vous sont connus avec cette techniques.