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

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    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 ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    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
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    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"];
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    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
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    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...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    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 !

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bonsoir, je reviens vers toi (merci de m'aider). Bon ce n'est pas encore au point mais je suis en train de penser à un truc : si au lieu de ça, on faisait un formulaire html standard, puis que dans l'action le serveur comparait les données utilisateur/mot de passe entrées par l'utilisateur à des données stockées dans une bdd MySQL ? Ca ne reviendrait pas au même ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Il y aurait des points communs, mais je pense que la solution formulaire + base de données est plus souple.
    - Tu peux styler le formulaire comme tu veux ;
    - c'est le serveur qui contrôle la session ;
    - tu peux utiliser des données supplémentaires pour l'authentification, par exemple un token de sécurité.

    Ce qui ne change pas en revanche, c'est que les données transitent toujours en clair. Dans une requête de formulaire, POST ou GET, il n'y a même pas de codage uuencode donc elles sont encore plus faciles à lire (*). Pour éviter ça, tu as deux solutions :
    - te payer un certificat pour servir tes pages en https ;
    - utiliser un certificat gratuit
    Il existe des CA (Certificate Authority) gratuits mais ils sont marginalisés : les navigateurs n'incluent pas leurs certificats dans leur liste de confiance. Les visiteurs reçoivent alors une alerte de sécurité, hautement décourageante, alors que le certificat est parfaitement fonctionnel. Le site CAcert est, à juste titre, un bon exemple.
    - utiliser une bibliothèque de chiffrement côté client.
    Pour être honnête je ne sais pas si ça existe, ni même si c'est raisonnable, car il s'agit en gros de reproduire le mécanisme https « à la main »...

    (*) C'est aussi valable pour le cookie qui contient l'identifiant de session (SESSID), qui est envoyé à chaque requête.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Vu tes réponses, j'ai visiblement à faire à un connaisseur...

    Que les identifiants soient visibles dans les en-têtes http ne me semble pas gênant vu que ça concerne un site intranet et non internet...

    J'en suis finalement resté au script d'identification et non passé à un formulaire html et après avoir tenté sans succès ce code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while (!isset($_SERVER['PHP_AUTH_USER'])) sleep(1);
    ...mon script
    j'ai pu corriger mon script pour qu'il n'utilise pas les variables $_SERVER['PHP_AUTH_*'].
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Ok !

    Quelques mots à propos de ton sleep (pas de jeu de mots hein, je te vois venir) : il n'avait aucune chance de fonctionner.

    D'abord, ce n'est pas exactement de l'attente active mais ça a les mêmes inconvénients : le thread alloué à ton script n'est pas réutilisable pendant la durée du sleep, et comme le nombre de threads est limité (20 en général), ton site peut devenir inaccessible pendant un pic de fréquentation. Voir ce commentaire.

    Ensuite, les variables de $_SERVER ne peuvent pas changer toutes seules pendant l'exécuction d'un script (sauf si ton script les modifie lui-même). Mettons que ton logiciel serveur est Apache par exemple. Quand il reçoit une requête concernant un fichier php, il est configuré pour appeler l'interpréteur PHP, et il lui passe en paramètre les caractéristiques de la requête. Entre autres, le tableau $_SERVER est construit à ce moment-là. L'interpréteur continue de tourner tant que la fin du script (ou une instruction exit) n'est pas atteinte. Et si le serveur reçoit une autre requête, il lance une nouvelle instance de l'interpréteur, dans un autre thread, avec un autre tableau $_SERVER.

    Pour résumer : chaque instance d'exécution de ton script a son propre tableau $_SERVER.
    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