- Type de bug : Faille cross scripting
- Zone du forum affectée : Autre
- Priorité du bug : Moyenne
- Description : Bonjour !
Je me suis aperçu qu'il a un problème dans le nettoyage pour (ou
contre) le register_globals.
La méthode Http::clean_gpc() sert à nettoyer les variables
globales créées si la directive register_globals est activé.
Le problème est qu'elle pourrait supprimer trop de variables globales.
Voyez, par exemple, les erreurs que peut générer ce problème :
- http://2fighteur.free.fr/forum/index.php?GLOBALS
- http://2fighteur.free.fr/forum/index.php?_COOKIE (perte de
connexion dans ce cas particulier pour les utilisateurs connectés)
Ce n'est pas grave mais il serait toujours possible, dans le forum
ou autre part, de mettre un lien
<a href="http://2fighteur.free.fr/forum/index.php?_COOKIE">Cliquez
ici http://2fighteur.free.fr/forum/index.php</a>
qui déconnecterait les utilisateurs du forum connectés qui
cliquerait dessus.
Sinon, une image dans un post du forum ou autre part <img
src="http://2fighteur.free.fr/forum/index.php?_COOKIE" />
peut avoir les mêmes effets.
Par contre, ce problème concerne potentiellement toutes les pages
du forum. C'est une faille de type XSRF. - Elément de réponse : Voici une proposition de remplacement pour Http::clean_gpc().
A noter que ce n'est pas parfait vu que les variables globales de
main/globals.php ne sont pas prises en compte.
PHP (Sélectionner le code)public static function clean_gpc() { // On supprime toutes les variables crées par la directive register_globals // On stripslashes() toutes les variables GPC pour la compatibilité DBAL $gpc = array('_GET', '_POST', '_COOKIE'); $magic_quoted = array('_GET', '_POST', '_COOKIE', '_REQUEST'); $keep_globals = array('_GET', '_POST', '_COOKIE', '_REQUEST', 'GLOBALS', '_SERVER', '_COOKIE', '_ENV', 'debug'); $magic_quote_gpc = get_magic_quotes_gpc() || get_magic_quotes_runtime(); $register_globals = ini_get('register_globals') ; if ($register_globals) { foreach ($gpc AS $value) { foreach ($GLOBALS[$value] AS $k => $v) { if (!in_array($k, $keep_globals)) { unset($GLOBALS[$k]); } } } } if ($magic_quote_gpc) { foreach ($magic_quoted AS $value) $GLOBALS[$value] = array_map_recursive('stripslashes', $GLOBALS[$value]); } } }
- Fichier(s) : main/class/class_http.php
- Base de donnée utilisée : MySQL 4
- Type de serveur : Apache (généralement unix)
|
|
Problème de register globals
Liens exploitant un mauvais nettoyage des register globals
|






