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 :

[Tableaux] Question pointue sur les headers (authenticate)


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Par défaut [Tableaux] Question pointue sur les headers (authenticate)
    Bonjour
    Afin de réaliser une authentification automatique sur mon site, je compte utiliser un script récupérant le login NT des utilisateurs.
    Pour ceci, j'envoie un header NTML, puis je décode son contenu (script disponible sur secusquad.com).
    Par contre, une fois le header envoyé, je ne peux réaliser d'envoi de formulaire POST : le tableau $_POST ne se remplit pas (ou bien les données sont perdues).
    Y a t il un moyen de remédier à ce souci ?

    D'avance merci.

    (modérateurs, question à déplacer ailleurs - PHP ?- si nécessaire)

    Le code correspondant est
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    <?php 
     
    print_r($GLOBALS); 
     
    $headers = apache_request_headers();     // Récupération des l'entêtes client 
    echo $headers['Authorization'];
     
     
    if (@$_SERVER['HTTP_VIA'] != NULL){ 	// nous verifions si un proxy est utilisé : parceque l'identification par ntlm ne peut pas passer par un proxy 
        echo "Proxy bypass!"; 
    } 
    elseif($headers['Authorization'] == NULL){              //si l'entete autorisation est inexistante 
            header( "HTTP/1.0 401 Unauthorized" );          //envoi au client le mode d'identification 
            header( "WWW-Authenticate: NTLM" );            	//dans notre cas le NTLM 
            exit;                           		//on quitte 
     
        } 
     
        if(isset($headers['Authorization']))                 //dans le cas d'une authorisation (identification) 
        {         
            if(substr($headers['Authorization'],0,5) == 'NTLM '){     // on vérifit que le client soit en NTLM 
     
                $chaine=$headers['Authorization'];                      
                $chaine=substr($chaine, 5);             // recuperation du base64-encoded type1 message 
                $chained64=base64_decode($chaine);        // decodage base64 dans $chained64 
     
                if(ord($chained64{8}) == 1){                     
                //          |_ byte signifiant l'etape du processus d'identification (etape 3)         
     
                // verification du drapeau NTLM "0xb2" à l'offset 13 dans le message type-1-message (comp ie 5.5+) : 
                    if (ord($chained64[13]) != 178){ 
                        echo "NTLM Flag error!"; 
                        exit; 
                    } 
     
                    $retAuth = "NTLMSSP".chr(000).chr(002).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000); 
                    $retAuth .= chr(000).chr(040).chr(000).chr(000).chr(000).chr(001).chr(130).chr(000).chr(000); 
                    $retAuth .= chr(000).chr(002).chr(002).chr(002).chr(000).chr(000).chr(000).chr(000).chr(000); 
                    $retAuth .= chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000); 
     
                    $retAuth64 =base64_encode($retAuth);        // encode en base64 
                    $retAuth64 = trim($retAuth64);             // enleve les espaces de debut et de fin 
                    header( "HTTP/1.0 401 Unauthorized" );         // envoi le nouveau header 
                    header( "WWW-Authenticate: NTLM $retAuth64" );    // avec l'identification supplémentaire 
                    exit; 
     
                } 
     
                else if(ord($chained64{8}) == 3){ 
                //          |_ byte signifiant l'etape du processus d'identification (etape 5) 
     
                    // on recupere le domaine 
                    $lenght_domain = (ord($chained64[31])*256 + ord($chained64[30])); // longueur du domain 
                    $offset_domain = (ord($chained64[33])*256 + ord($chained64[32])); // position du domain.     
                    $domain = str_replace("\0","",substr($chained64, $offset_domain, $lenght_domain)); // decoupage du du domain 
     
                    //le login 
                    $lenght_login = (ord($chained64[39])*256 + ord($chained64[38])); // longueur du login. 
                    $offset_login = (ord($chained64[41])*256 + ord($chained64[40])); // position du login. 
                    $login = str_replace("\0","",substr($chained64, $offset_login, $lenght_login)); // decoupage du login 
     
                    if ( $login != NULL){ 
                        // stockage des données dans des variable de session 
                        $_SESSION['Login']=$login; 
                        //echo $_SESSION['Login'];
                        //header("Location: index.php"); 
                        //exit; 
                    } 
                    else{ 
                        //echo "NT Login empty!"; 
                    } 
     
     
                } 
            } 
     
    } 
     
     
    ?>
    <html>
     
    	<head><title>Connexion</title></head>	
     
    	<body>
     
     
    	<center style="font-family: Verdana; font-size: 10pt;">
     
    	<h3 style="margin-bottom: 0px;">Consultation en ligne</h3>
    	<h3 style="margin-bottom: 0px;">Merci de vous identifier</h3>
     
    	<br /><br />
     
    	<form action="test.php" method="post">
     
    	  <input type="hidden" name="action" value="verif">
     
    	  <label>Identifiant : <input type="text" name="pseudo"></label><br>
    	  <label>Mot de passe : <input type="password" name="password"></label><br><br>
     
    	  <input type="submit" value="Connexion">
     
     
     
    	</form>
     
    	</center>
     
    	</body>
     
    	</html>

  2. #2
    Membre confirmé Avatar de Luffy Duck
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 165
    Par défaut
    Pour utiliser l'authentification NTLM, il y a une option a activée sous IE. (Outils ->Options Internet ->Avancé ->Activer l'authentification Windows.

    Et dans ce cas, il n'y a pas besoin de formulaire , donc pas de variables $_POST[] !

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Par défaut
    Merci, mais le problème n'est pas dans l'authentification : si elle n'est pas activée, je modifie les headers.
    Le problème est qu'une fois que j'ai modifié les headers, il n'est plus possible d'utiliser POST dans ce formulaire (mais dans d'autres sur la page principale, pas de problème).

  4. #4
    Membre confirmé Avatar de Luffy Duck
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 165
    Par défaut
    je n'avais pas compris, pardon...

    J'ai regardé dans la RFC, et il y a quelque chose qui pourrait peut-être t'aider : il y a une instruction dans les header que le serveur renvoie qui est : "Allow", et tu peux mettre get, post ou head.

    En gros ça donne : Allow : POST. J'ai trouvé ça sur cette page section 10 si tu veux aller voir : http://abcdrfc.free.fr/rfc-vf/rfc1945.html

  5. #5
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Par défaut
    merci, j'ai essayé tout ça mais sans résultat probant.

    Je suis à peu près certain que le problème vient soit des headers 403 ou authenticate NTLM.
    Y a-t-il un moyen de vider les headers avec une fonction php ? J'ai essayé ob_end_flush(), mais ca ne fonctionne pas non plus...

Discussions similaires

  1. question de code pure sur les headers
    Par deubelte dans le forum Débuter
    Réponses: 2
    Dernier message: 09/09/2010, 19h10
  2. question bête sur les tableaux à 2 dimensions
    Par laurentSc dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/10/2009, 22h41
  3. Question sur les headers
    Par Telemak dans le forum C++
    Réponses: 9
    Dernier message: 27/06/2008, 21h18
  4. [MySQL] Question simple sur les tableaux pour un initié
    Par bom8407@hotmail.com dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 01/03/2007, 11h22
  5. Question basique sur les tableaux
    Par valanagrid dans le forum C++
    Réponses: 8
    Dernier message: 08/11/2006, 15h47

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