IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

variables superglobales $_SERVER dans une fonction


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut variables superglobales $_SERVER dans une fonction
    Bonsoir,

    je me connecte à ma bdd MySQL via les variables superglobales $_SERVER["PHP_AUTH_USER"] et $_SERVER["PHP_AUTH_PW"] (mysql_connect("localhost",$_SERVER["PHP_AUTH_USER"],$_SERVER["PHP_AUTH_PW"] )). Or dans ma fonction, ces variables superglobales sont vides (alors qu'elles sont bien affectées à un autre endroit) : une fois, l'authentification effectuée, ne sont-elles pas disponibles partout ?

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 101
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    (alors qu'elles sont bien affectées à un autre endroit)
    Tu veux dire que tu les définis toi-même ? Ces variables sont censées être créées par le serveur.
    http://fr2.php.net/reserved.variables.server.php

    Si tu les redéfinis, leur valeur ne sera pas conservée d'un script à l'autre. $_SERVER ne fonctionne pas comme une session.

    Peux-tu me dire en quelques mots comment tu as mis en œuvre ton authentification ? Est-ce que ta méthode ressemble à celle-ci ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Désolé de t'avoir enduit d'horreur (j'aime bien ce jeu de mots )
    Quand je disais "affectées", je pensais "le serveur les a positionnées" (donc affectées pour moi).

    Voici l'authentification :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	  header( 'WWW-Authenticate: Basic realm="EIS SUPPORT WEBSITE"' );
    	  header("HTTP/1.1 401 Unauthorized");
    	  echo "Accès Restreint...<br>";
    	  echo "<a href=\"index.php\">Authentification</a>";
    et ailleurs :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	$entered_user = $_SERVER["PHP_AUTH_USER"];
    	$entered_pass = $_SERVER["PHP_AUTH_PW"];

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 101
    Par défaut
    Sur la même page ?

    Désolé si j'enfonce des portes ouvertes, mais voilà : les informations d'authentification sont envoyées par le client, comme s'il soumettait un formulaire HTML. Ça se fait en deux étapes :
    1a. Le client non authentifié accède à ton script
    1b. Ton script répond avec les header 401, etc.
    2a. Le client envoie les informations d'authentification
    2b. Là, ton script peut utiliser les variables PHP_AUTH_*

    Dans les étapes 1a et 1b, les informations sont absentes, donc si tu fais tout dans le même script, et si tu ne l'as pas déjà fait, tu dois rajouter un test isset($_SERVER['PHP_AUTH_USER']) pour la partie qui gère 2a et 2b, comme dans cet exemple.

    Sur la page que je viens de lier il y a également un passage un peu plus haut à propos du safe mode, qui pourrait poser problème. Jette un œil
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Je vais encore jouer sur les mots : jeter un oeil, OK mais le droit ou le gauche ?

    Tu n'enfonces pas des portes ouvertes car je ne suis pas l'auteur de ce script, que je récupère donc, et je ne connaissais pas du tout la question. Donc le cours php avec les points 1a, 1b, 2a et 2b n'est pas inutile.

    Je te pose donc des questions : les points 1a et 1b, OK, c'est le premier bout de code que j'ai donné, mais le point 2a, c'est quoi ? Le point 2b, OK ; chez moi, c'est le code que le client appelle. Et qui ne marchera que si les variables $_SERVER["PHP_AUTH_*"] existent, d'où le test du isset, mais si elles n'existent pas (ce qui est visiblement le cas vu qu'elles sont normalement utilisées et que le script échoue), on fait quoi ?

    Et j'avoue ne pas avoir capté le couplet sur le safe mode...

  6. #6
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 101
    Par défaut
    Le serveur c'est la machine qui fait tourner PHP. Le client c'est le navigateur.

    Au point 1b le navigateur reçoit un code HTTP 401. Il est programmé pour afficher dans ce cas une fenêtre à l'utilisateur, lui demandant des informations d'authentification. Une fois que l'utilisateur clique sur « Ok », ce sont ces informations que le navigateur envoie, dans une nouvelle requête au serveur, et c'est le point 2a.

    Voici une page de test que j'ai nommée authentification.php. Dans un nouvel onglet, ouvre la console de ton navigateur (F12) et sélectionne l'onglet réseau, puis va sur la page de test en passant par ton localhost.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php # authentification.php
    header('Content-Type: text/html; charset=utf-8');
     
    // partie non restreinte
     
    if (!isset($_SERVER['PHP_AUTH_USER'])) {
       header('WWW-Authenticate: Basic realm="Royaume champignon"');
       header('HTTP/1.0 401 Unauthorized');
       echo '<h1>401 Nope</h1>';
       exit;
    }
     
    // partie restreinte
     
    var_dump(array_intersect_key($_SERVER, [
       'PHP_AUTH_USER' => null,
       'PHP_AUTH_PW' => null,
       'REMOTE_USER' => null
    ]));
     
    ?>
    En ouvrant la page tu verras apparaître la fenêtre d'authentification, ainsi qu'une ligne GET dans la console. Cett ligne représente la requête que ton navigateur a adressée au serveur (étape 1a), ainsi que la réponse du server (étape 1b).

    Si tu fais « Annuler » à ce moment-là, le navigateur se contente de fermer la fenêtre, rien n'est envoyé au serveur.

    Si tu remplis les champs et cliques sur « Ok », le navigateur envoie les informations (2a).
    Le serveur le reçoit et c'est alors la partie restreinte du script PHP qui est exécutée : le serveur renvoie ce qui est produit par le var_dump (2b).

    Une seconde ligne GET apparaît dans la console ; clique dessus et regarde les informations « en-têtes de la requête », il y a un nouvel en-tête par rapport à la requête précédente. Il s'agit de l'en-tête Authorization et il contient les informations d'authentifications encodées avec l'algorithme uuencode. NB : ce n'est pas un algorithme de chiffrage, les données ne sont pas protégées !




    Le safe mode, je ne pourrais pas t'expliquer ce que c'est (ou plutôt ce que c'était) mieux que le manuel : safe mode. Il est probablement activé sur ton serveur si celui-ci est mutualisé et fait tourner une version de PHP pas à jour. Pour le savoir, regarde le phpinfo et recherche la chaîne « safe_mode ». Si elle est présente et que la valeur est « On » ça signifie que le safe mode est activé.

    Si en plus d'avoir le safe mode activé, tu as un mécanisme d'authentification non PHP déjà en place (par exemple avec un .htaccess), alors PHP ne remplit pas les variables PHP_AUTH. C'est une malchance assez rare mais ça pourrait expliquer les symptômes. Pour vérifier s'il y a une authentification non PHP, fais var_dump($_SERVER['REMOTE_USER']);.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Variable non stockée dans une fonction
    Par LaVaZza dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/07/2009, 17h49
  2. Réponses: 0
    Dernier message: 07/11/2008, 14h25
  3. Réponses: 6
    Dernier message: 30/10/2007, 12h27
  4. Utilisation de variables de Gui dans une fonction
    Par campofelliz dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 20/08/2007, 17h46
  5. Réponses: 6
    Dernier message: 18/04/2007, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo