[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:
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> |