J'ai parcouru quelques messages de groupes de discussion sur Internes PHP et a trouvé une discussion intéressante sur le sujet. Le fil de discussion initial portait sur autre chose, mais une remarque de Stefan Esser, un (si ce n'est pas un le site ), expert en sécurité dans le monde PHP, a orienté la discussion vers les implications en matière de sécurité de l'utilisation de $_REQUEST pour quelques messages.
Citant Stefan Esser sur les internes de PHP
$_REQUEST est l'une des plus grandes faiblesses de conception de PHP. Toute application utilisant $_REQUEST est probablement vulnérable aux problèmes de contrefaçon de requêtes Forgery. (Cela signifie que si, par exemple, un cookie nommé (age) existe, il remplacera toujours le contenu GET/POST et par conséquent des requêtes non désirées seront effectuées)
et dans un réponse ultérieure au même fil de discussion
Il ne s'agit pas du fait que quelqu'un puisse falsifier les variables GET, POST et COOKIE. Il s'agit du fait que les COOKIE vont écraser les données GET et POST dans les variables REQUEST.
Je pourrais donc infecter votre navigateur avec un cookie qui dit par exemple action=logout et à partir de ce jour vous ne pouvez plus utiliser l'application l'application parce que REQUEST[action] sera toujours logout (jusqu'à ce que vous supprimez manuellement le cookie).
Et pour vous infecter avec un COOKIE, c'est si simple...
a) Je pourrais utiliser une vulnérabilité XSS dans n'importe quelle application sur un sous-domaine.
b) Avez-vous déjà essayé d'installer un cookie pour *.co.uk ou *.co.kr lorsque vous possédez une domaine unique ?
c) Autres domaines croisés de quelque manière que ce soit...
Et si vous pensez que ce n'est pas un problème, alors je peux vous dire que il y a une possibilité simple de définir par exemple un cookie *.co.kr qui résulte plusieurs versions de PHP ne renvoient que des pages blanches. Imaginez : Un seul cookie pour tuer toutes les pages PHP dans *.co.kr.
Et en plaçant un ID de session illégal dans un cookie valide pour *.co.kr dans une variable appelée +PHPSESSID= illégal vous pouvez toujours DOS chaque PHP en Corée en utilisant des sessions PHP...
La discussion se poursuit pendant quelques posts supplémentaires et est intéressante à lire.
Comme vous pouvez le constater, le principal problème de $_REQUEST n'est pas tant qu'il contient des données provenant de $_GET et $_POST, mais aussi de $_COOKIE. D'autres personnes sur la liste ont suggéré de changer l'ordre dans lequel $_REQUEST est rempli, par exemple en le remplissant d'abord avec $_COOKIE, mais cela pourrait conduire à de nombreux autres problèmes potentiels, par exemple avec la gestion de la session .
Vous pouvez cependant omettre complètement $_COOKIES du global $_REQUEST, de manière à ce qu'il ne soit pas écrasé par les autres tableaux (en fait, vous pouvez le limiter à n'importe quelle combinaison de son contenu standard, comme l'option Manuel PHP sur le ordre_variable paramètre ini nous dit :
variable_order Définit l'ordre d'analyse des variables EGPCS (Environment, Get, Post, Cookie, and Server). Par exemple, si variables_order est défini à "SP", PHP créera les superglobales $_SERVER et $_POST, mais ne créera pas $_ENV, $_GET, et $_COOKIE. La valeur "" signifie qu'aucun superglobal ne sera créé.
Mais encore une fois, vous pouvez aussi envisager de ne pas utiliser $_REQUEST, tout simplement parce qu'en PHP, vous pouvez accéder à Environment, Get, Post, Cookie et Server dans leurs propres globales et avoir un vecteur d'attaque en moins. Vous devez toujours assainir ces données, mais c'est un souci de moins.
Maintenant, vous pouvez vous demander pourquoi $_REQUEST existe après tout et pourquoi il n'est pas supprimé. Cette question a également été posée sur PHP Internals. Citant Rasmus Lerdorf à propos de Pourquoi $_REQUEST existe-t-il ? sur les internes de PHP
Plus on supprime ce genre de choses, plus il devient difficile pour les gens de de passer rapidement à des versions plus récentes, plus rapides et plus sécurisées de PHP. C'est Cela cause bien plus de frustration pour tout le monde que quelques "vilaines" fonctionnalités héritées fonctionnalités. S'il y a une raison technique décente, de performance ou de sécurité, alors nous ne pouvons pas supprimer ces fonctionnalités. sécurité, alors nous devons y jeter un coup d'oeil. Dans ce cas, la Dans ce cas, la chose que nous devrions regarder n'est pas si nous devrions supprimer $_REQUEST mais si nous devons supprimer les données des cookies. De nombreuses configurations font déjà cela, y compris toutes les miennes, et il y a une forte raison de sécurité valide de sécurité pour ne pas inclure les cookies dans $_REQUEST. La plupart des gens utilisent $_REQUEST pour signifier GET ou POST, sans se rendre compte qu'il peut aussi contenir des cookies. des cookies et qu'en tant que tels, les méchants peuvent potentiellement faire des injections de cookies et casser des applications naïves.
En tout cas, j'espère que ça vous a éclairé.
2 votes
Voir les questions et réponses connexes : stackoverflow.com/questions/1149118/
2 votes
Depuis php 5.3, le php.ini par défaut indique que seules les données GET et POST sont placées dans le fichier
$_REQUEST
. Ver php.net/request_order Je viens de tomber sur cette rupture de rétrocompatibilité en m'attendant à ce que les données des cookies soient dans le fichier$_REQUEST
et je me demandais pourquoi ça ne marchait pas ! Donc la plus grande raison d'éviter d'utiliser $_REQUEST est maintenant que votre script ne peut pas définirrequest_order
lui-même (il estPHP_INI_PERDIR
), donc un changement de php.ini peut facilement casser les hypothèses sur lesquelles votre script est construit. Mieux vaut mettre ces hypothèses directement dans votre script.