2010-11-29 4 views
6

Contexte

J'ai un Apache/2.2.15 (Win32) avec PHP/5.3.2 mis en place, l'authentification de manipulation.Impossible de récupérer les variables d'environnement Apache en PHP

<Directory /usr/www/myhost/private> 
    # core authentication and mod_auth_basic configuration 
    # for mod_authn_dbd 
    AuthType Basic 
    AuthName "My Server" 
    AuthBasicProvider dbd 

    # core authorization configuration 
    Require valid-user 

    # mod_authn_dbd SQL query to authenticate a user 
    AuthDBDUserPWQuery "SELECT Password,UserName,Realm,Access FROM authn WHERE user = %s" 
</Directory> 

L'authentification fonctionne correctement! Pas de problème.

Mais en ce qui concerne la documentation, tout champ supplémentaire retourné de la AuthDBDUserPWQuery sera mis en une AUTHENTICATION_fieldname variable dans l'environnement.

Avec phpinfo(), je peux voir ces variables avec des valeurs correctes sous "Environnement Apache".

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

Problème

Je ne peux pas récupérer ces variables d'environnement de mon php.

1 <?php 
2 $Access = apache_getenv('AUTHENTICATE_ACCESS',true); 
3 var_dump($Access); 
4 ?> 

La ligne 3 affiche bool (false) indiquant que la variable n'a pas été trouvée!
Cependant, si je change pour une autre variable d'environnement Apache telle que 'HTTP_HOST' cela fonctionne.
..et oui, j'ai aussi essayé getenv(), même résultat.

Il est également noté que le serveur Apache doit être compilé avec APR 1.3.0 pour fonctionner. J'ai utilisé la construction Apache msi de httpd.apache.org et il semble être compilé avec APR au-dessus de la version 2. Puisque je peux les voir avec phpinfo() ils doivent être accessibles depuis PHP.

+2

* \ [♦ note: Voir [historique des révisions] (http://stackoverflow.com/posts/4308886/revisions) pour le contexte de ce commentaire.] * Nous ne parlons généralement pas de l'anglais de quelqu'un (le tien est joli bon) et si le formatage de votre code aspirait quelqu'un l'éditerait probablement donc c'est bien lisible. De plus, ce n'est pas l'endroit où les gens sont invités à google/rtfm - googling/rtfming est ce que les gens qui répondent pourraient faire comme ils vont obtenir + représentant pour cela, ce qui entraînerait très probablement -rep. : p – ThiefMaster

+0

Je n'ai pas de réponse à votre question, mais +1 pour avoir la question la mieux structurée que j'ai jamais vue sur SO. –

+0

Question parfaitement valide, pas besoin d'être si défensive. :) Les réponses RTFM sont généralement réservées à beaucoup, * beaucoup * de pires (non) questions. – deceze

Répondre

1

J'ai fait un travail autour,

Il semble que cela pourrait être un bug PHP. J'ai trouvé quelques bogues rapportés pour PHP 4 et peut-être qu'ils ne les ont pas encore corrigés ...

J'ai fait une solution que je n'aime vraiment pas (parce que j'accède à la table Apache userdata), mais il semble que je n'ai pas le choix.

//************************************************************* 
// If PHP failed to retrieve the AuthDBDUserPWQuery fields. 
// Connect to Apache authentication databaseand create the 
// envirnment variables manually 
// 
if (empty($_ENV['AUTHENTICATE_ACCESS'])) { 
    $Apache = mysql_connect('MyServerIP','MyUserName','MyPassword',false,MYSQL_CLIENT_SSL|MYSQL_CLIENT_COMPRESS); 
    mysql_select_db('MyDatabase',$Apache); 
    $SQLSet = mysql_query("SELECT Realm, Access FROM authenticationtable WHERE UserName='".$_SERVER['PHP_AUTH_USER']."' AND Password='".$_SERVER['PHP_AUTH_PW']."'"); 
    $SQLRow = mysql_fetch_array($SQLSet); 
    $_ENV['AUTHENTICATE_REALM'] = $SQLRow['Realm']; 
    $_ENV['AUTHENTICATE_ACCESS']= $SQLRow['Access']; 
    mysql_close($Apache); 
} 

Si PHP n'a pas réussi à mettre à jour _ENV $ correcte, cela récupérera l'utilisateur actuellement connecté à partir de la même base de données et une table que Apache utilise pour l'authentification. Ensuite, les champs supplémentaires seront écrits dans la variable globale $ _ENV afin qu'il puisse être utilisé comme il est supposé. Plus tard, lorsque le "bug" est corrigé, il utilisera automatiquement le $ _ENV d'origine.

Si quelqu'un peut apporter un peu des informations à jour sur ce sujet, je serais heureux ...

+1

Et comment cela peut-il être déprimé?!? J'ai trouvé une solution à mon propre questionnaire et l'ai posté pour que d'autres puissent le voir. Si vous allez voter, veuillez indiquer pourquoi?!? –

3

J'ai utilisé cette règle mod_rewrite dans un fichier .htaccess pour rendre la variable d'environnement d'en-tête HTTP Authorization disponible dans $_SERVER['HTTP_AUTHORIZATION']. Je suis sûr que cela pourrait être adapté à vos besoins. Je ne sais pas si elle est la meilleure solution, mais il est une solution:

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last] 
+0

+1 pour avoir essayé: D J'ai dû lire RewriteRule pour comprendre ce que vous avez suggéré. Mais je ne pense pas que cela fonctionnera. Si je comprends bien ce droit,% {HTTP: Authorization} est déjà présent dans votre en-tête HTTP et vous "copiez" uniquement les informations dans l'environnement Apache. Dans mon cas, AuthDBDUserPWQuery crée des variables "environnement Apache" pour chaque champ supplémentaire (après mot de passe) de l'instruction SQL. Ces valeurs ne sont pas présentes ailleurs. Est-ce que cela peut être un bug en PHP que seules les variables Apache prédéfinies peuvent être récupérées? –

+0

@Max Hmm, je vois ... Je n'ai rien d'autre, malheureusement. – deceze

0

Il y a un indice dans la réponse de deceze.Il récupère les données de $ _SERVER au lieu de $ _ENV.

Je mettais un Apache avec Var Env

SenEnv MY_VAR "true" dans la principale httpd.conf et ne pouvait pas le voir en $ _ENV. C'était dans $ _SERVER cependant.

0

Récemment, j'ai écrit une bibliothèque pour obtenir des valeurs de variables d'environnement et analyser les types de données PHP. Cette bibliothèque peut être utilisée pour analyser les variables d'environnement en types de données PHP (comme la conversion en entier, float, null, booléen), analyser les structures de données complexes comme une chaîne JSON et plus avec la contribution de la communauté.

La bibliothèque est disponible ici: https://github.com/jpcercal/environment

Configurez vos variables d'environnement avec htaccess par exemple:

SetEnv YOUR_ENV_VARIABLE_NAME the-value-of-your-env-var 

Et pour obtenir les valeurs de la variable d'environnement (indépendamment de l'environnement CLI, Apache, Nginx , PHP Built-in Server et plus) pour le faire:

<?php 
// ... 
require "vendor/autoload.php"; 
// ... 
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME")); 

Profitez-en.

Questions connexes