NTLM GET LOGIN WINDOWS WITH PHP

derfum Messages postés 45 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 5 septembre 2004 - 10 août 2004 à 11:33
haythem1986 Messages postés 1 Date d'inscription jeudi 26 septembre 2013 Statut Membre Dernière intervention 26 septembre 2013 - 26 sept. 2013 à 22:11
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25272-ntlm-get-login-windows-with-php

haythem1986 Messages postés 1 Date d'inscription jeudi 26 septembre 2013 Statut Membre Dernière intervention 26 septembre 2013
26 sept. 2013 à 22:11
Salut je te remercie pour ce code il focntionne a merveille sur mon environnement localhost. Mais lorsque j' ai essaye de le mettre sur le serveur de l'entreprise il ne fonctionne pas je pense bien que c'est un pb par rapport a la version car le serveur tourne avec une version qui n'a pas etais mis a jours mais avec du php5. Alors est ce que ta une idee que faut il faire pour integrer ce code .

Merci
Haythem
cs_g41687 Messages postés 4 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 21 mars 2011
21 mars 2011 à 09:45
Bonjour,

Je rencontre le problème suivant (au bureau sur des PCs XP prof SP3):
Chaine64Decode s'arrête à la fin du nom de domaine et je reçois donc un 401:
NTLMSSPtŒ HTd€,ÎNOMDEDOMAINE
Comme je n'ai aucun accès à la registry au bureau, impossible de tester le bypass décrit dans le commentaire de Commentaire de zpef le 09/07/2009 00:01:53
Une autre idée ?
D'avance, merci ;o)
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
2 août 2010 à 21:41
Bonjour à tous,

Petite précision dans le cas où vous utilisez le protocole https. Il faut commenter les lignes suivantes dans le fichier httpd-ssl.conf :
#BrowserMatch ".*MSIE.*" \
# nokeepalive ssl-unclean-shutdown \
# downgrade-1.0 force-response-1.0
sicilian021 Messages postés 2 Date d'inscription samedi 28 juillet 2007 Statut Membre Dernière intervention 2 août 2007
10 mars 2010 à 10:27
Par toutatiss !
Moi je dit Monsieur ! Génial ce code ... absolument ce dont j'avais besoin ...
je recupère parfaitement le login NT, mais il y a un truc que je ne comprend pas, j'ai du modifier :
if (ord($chained64[13]) != 178){ par
if (ord($chained64[13]) != 130){
chez moi quand je faisais un echo $chained64[13] j'avais 130 donc j'ai modifié le test, et je récupère bien mon ID
pourquoi que chez moi c'est 130 ? et dans le code c'est 178 ?
jmeunier Messages postés 86 Date d'inscription mardi 10 septembre 2002 Statut Membre Dernière intervention 17 mai 2013
9 juil. 2009 à 11:08
Salut ZPEF,

J'ai appliqué la méthode, et, effectivement je re-récupère le login
Merci pour l'info, cela faisait longtemps que je tournais en rond ...
zpef Messages postés 30 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 26 janvier 2011
9 juil. 2009 à 00:01
Cela m'inquiète grandement car mon appli est critique.
Plusieurs sites parlent d'appliquer la méthode 1 de la page http://support.microsoft.com/kb/896861 afin de résoudre la problème.
Tu peux essayer et nous tenir au courant ?
jmeunier Messages postés 86 Date d'inscription mardi 10 septembre 2002 Statut Membre Dernière intervention 17 mai 2013
5 juil. 2009 à 13:18
tout fonctionnait très bien jusqu'à la mise à jour windows KB963027 qui est en partie une mise à jour cumulative de sécurité IE6, IE7.

Cette mise à jour "tronque" le header de réponse

AVANT la mise à jour :
login : JMEUNIER
Chaine : TlRMTVNTUAADAAAAGAAYAHQAAAAYABgAjAAAAAwADABIAAAAEAAQAFQAAAAQABAAZAAAAAAAAACkAAAABYIAAgUCzg4AAAAPQwBSAE4AUABEAEMASgBNAEUAVQBOAEkARQBSAEkAMAAwADUANgA1ADQAOAB6ElVFkk+Tlk3+0P/P19E2VRZiaCMzBY56ElVFkk+Tlk3+0P/P19E2VRZiaCMzBY4=
Chaine64Decode : NTLMSSPtŒ HTd€‚ÎNOMDEDOMAINEJMEUNIERI0056548zUE’O“–MþÐÿÏ×Ñ6Ubh#3ŽzUE’O“–MþÐÿÏ×Ñ6Ubh#3Ž

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: fr
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; WOW64; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
Host: xx.yy.fr
Connection: Keep-Alive
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHQAAAAYABgAjAAAAAwADABIAAAAEAAQAFQAAAAQABAAZAAAAAAAAACkAAAABYIAAgUCzg4AAAAPQwBSAE4AUABEAEMASgBNAEUAVQBOAEkARQBSAEkAMAAwADUANgA1ADQAOAB6ElVFkk+Tlk3+0P/P19E2VRZiaCMzBY56ElVFkk+Tlk3+0P/P19E2VRZiaCMzBY4=

APRES la mise à jour :
Chaine : TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFASgKAAAAD0==
Chaine64Decode : NTLMSSP‚¢( 
NTLM Flag error!
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, */*
Accept-Language: fr
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
Host: xx.yy.fr
Connection: Keep-Alive
Authorization: NTLM TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFASgKAAAAD0==

Tout fonctionne très bien en FireFox.Quelqu'un a-t-il déjà rencontré ce problème ?
stany911 Messages postés 1 Date d'inscription mercredi 26 novembre 2008 Statut Membre Dernière intervention 1 décembre 2008
1 déc. 2008 à 11:59
PHP5/Apache/I.E. 6.0
Bonjour à tous,
j'ai bien suivi le script, les recommandations mais je n'arrive pas à récupérer le login windows, la page reste blanche et la redirection ne s'effectue pas... je vous avoue que je ne comprends pas.
finnforest Messages postés 1 Date d'inscription lundi 9 mai 2005 Statut Membre Dernière intervention 29 octobre 2008
29 oct. 2008 à 13:08
Salut,
juste pour info, au cas où cela arriverait à quelqu'un d'autre, il faut ABSOLUMENT avoir allow_call_time_pass_reference à On dans le php.ini.

sinon ça plante !
++
Sylvain.
elisabeth_nov Messages postés 103 Date d'inscription jeudi 2 mars 2006 Statut Membre Dernière intervention 4 février 2009
20 oct. 2008 à 10:41
Bonjour,

mon problème est que ie me dit qu'il ne trouve pas la page (erreur 404) malgré les modifications indiqué par Zpef et Barbenoire. J'ai besoin de ce code pour récupérer le login windows pour l'authentification automatique dans un intranet. Quelqu'un peut il m'aider? c'est assez urgent!!!!!

Merci d'avance
zpef Messages postés 30 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 26 janvier 2011
16 juin 2008 à 19:03
J'ai eu d'autres soucis à l'époque de mon installation et dont je n'ai pas reporté ici les infos :

Déjà, si vous utilisez Zend Core ou, d'une manière générale, si la fonction apache_request_headers n'est pas disponible ou ne ramène pas les bons entêtes, vous pouvez utiliser cette fonction (trouvée dans les commentaires de la doc PHP en ligne) :

function request_headers()
{
if(function_exists("apache_request_headers")) // If apache_request_headers() exists...
{
if($headers = apache_request_headers()) // And works...
{
return $headers; // Use it
}
}

$headers = array();

foreach(array_keys($_SERVER) as $skey)
{
if(substr($skey, 0, 5) == "HTTP_")
{
$headername = str_replace(" ", "-", ucwords(strtolower(str_replace("_", " ", substr($skey, 5)))));
$headers[$headername] = $_SERVER[$skey];
}
}

return $headers;
}

Enfin, j'ai eu le même problème que BarbeNoire avec le message "impossible d'afficher la page". Je l'ai résolu en envoyant un simple caractère blanc dans tous les appels à la fonction "exit" :
...
header('WWW-Authenticate: NTLM '. $retAuth64); // with identification
exit(' ');
...

Il semble en effet que l'envoi d'une page sans contenu perturbe le fonctionnement dans certains cas.

En espérant que ça aide ! Et bon courage ! :)
cs_barbeNoire Messages postés 3 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 16 juin 2008
16 juin 2008 à 14:24
J'ai finalement résolu le problème d' IE6 sous XP SP2 à force de chercher :

- j'ai remplacé les chaines header( "HTTP/1.0 par header( "HTTP/1.1
- j'ai crée une autre page servant d'index et qui me redirige vers la page où se trouve le bon vieux script php ntlm

Résultat des courses : sso automatique sous IE6 sans fenêtre d'authentification et cela continue à tourner sans pb sous firefox.

Que du bonheur enfin !!!!!!
cs_barbeNoire Messages postés 3 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 16 juin 2008
15 juin 2008 à 12:38
En fait , c'est la première instruction header( "HTTP/1.0 401 Unauthorized" ) qui me crée la page "la page ne peut pas être affichée " sous IE6. Le navigateur IE6 reste bloqué et ne continue pas la suite de la négociation NTLM.

Personne n'a recontré ce problème?
cs_Brydjy Messages postés 19 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 21 juin 2009
11 juin 2008 à 08:27
moi juste pour info, j'ai utilisé du javascript car je n'arrive pas à faire fonctionner ce code, dommage il avait l'aire bien, ceci dit le miens marche aujourd'hui...
cs_barbeNoire Messages postés 3 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 16 juin 2008
10 juin 2008 à 14:58
Salut,

Ce script fonctionne bien chez moi sous firefox mais pas sous IE6 : j'obtient "impossible d'afficher la page".

Ma config : Apache/Joomla1.5 sous winXP SP2.J'utilise PHP5.

Je me suis aperçu que sous IE6 la fonction apache_request_headers() ne me retournait pas tous les headers et notamment le header 'Authorization'.

Merci de m'aider car je suis desespéré.............................
cs_diablo19 Messages postés 2 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 20 mars 2008
20 mars 2008 à 16:52
Bonjour

j'ai testé ton code, et j'ai remarqué qu'il accepte n'importe quel login, même si ce dernier n'est pas le bon login NT windows, càd que n'inmporte qui peut se connecter en mettant un login/pass bidon.

tu peux m'expliquer STP
cs_Brydjy Messages postés 19 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 21 juin 2009
17 mars 2008 à 08:55
bonjour,
est ce que le code à été édité, car j'ai beau le copier et faire les modifs, et bien j'ai toujours les erreurs qui se présentent.
Est ce que quelqu'un peut me confirmer le code, et essayer de m'apporter une petite aide SVP.
Merci d'avance
Cdt
titoomat Messages postés 1 Date d'inscription mercredi 27 février 2008 Statut Membre Dernière intervention 28 février 2008
28 févr. 2008 à 11:20
Felicitation secusquad pour ce code qui fonctionne a merveille !

Je te mets un 10/10 et je te dis un grand merci.

Cordialement

TiToo
zpef Messages postés 30 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 26 janvier 2011
4 févr. 2008 à 09:44
Problème du $_POST vide avec Internet Explorer :

J'utilise Apache et j'ai rencontré le même problème que nombre d'autres concernant
les $_POST vides. J'ai trouvé l'explication et donc la solution sur ce point.
Pour l'explication, je vous renvoie à cette merveilleuse documentation sur le NTLM :
http://davenport.sourceforge.net/ntlm.html#ntlmHttpAuthentication

Il y est notamment expliqué que certains clients web (et c'est le cas d'IE) vont
renvoyer une demande d'authentification de type 1 avant tout envoi d'une requête POST.

J'ai donc solutionné mon problème ainsi : j'utilise le script de Secusquad pour
identifier l'utilisateur à chaque nouvelle session. Une fois l'utilisateur identifié,
je me contente juste de répondre (en tout début des scripts) avec un message type2
quand IE m'envoie sa demande de type1, comme ça, il est content et m'envoie mon $_POST :

// Authorization header found
if (isset($headers['Authorization']) && substr($headers['Authorization'], 0, 5) == 'NTLM ')
{
// Decode base64-encoded type1 message
$chained64 = base64_decode(substr($headers['Authorization'], 5));
if (ord($chained64{8}) == 1)
{
// |_ byte signifying the stage of authentication procedure (stage 3)
$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);
header("HTTP/1.1 401 Unauthorized" ); // Send new header
header("WWW-Authenticate: NTLM ". trim(base64_encode($retAuth))); // with base64 encoded identification
exit;
}
}

Et ça fonctionne nickel !!!
predator747 Messages postés 4 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 7 décembre 2007
7 déc. 2007 à 18:46
RE CORESP
PS: n'oublie pas aussi d'actualiser ton navigateur web a chaque fois en appuyant sur F5 ou onglet affichage>actualiser
puis redemarre aussi ton serveur si necessaire
on sait jamais

R.Razafimamonjy
(www.razafimamonjy.fr) visiter mon site web et apportez en aussi vos critique dessus car j'ai pas mal de bug aussi la dessus et cliquer aussi sur les pubs s'il vous plait
predator747 Messages postés 4 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 7 décembre 2007
7 déc. 2007 à 18:28
Salut CORRESP
Moi j'ai une exactement les memes erreur aussi mais j'éspère en tous cas que t'as pris le code de SESUSQUAD ci dessus en ayant fait du copier coller direct sinon t'aurais des problème d'espace et d'emplacement de fin de tache du style "}" qui seront déplacé et ça c pa bon ça, car php peut déconner avec des fois.
Ce qu'il fallait faire déjà c'est télécharger le script de SESUSQUAD LA celui qui s'appelle index.Php
puis dedans suit bien à la lettre les modif que j'ai mis en haut comme suit: copie et coller et enregistre ceci dans toto.Php puis n'oublie pas de creer ta page cible là "newpage.PHP"

<?php

session_start();

$headers = apache_request_headers(); // RÈcupÈration des l'entÍtes client

if (@$_SERVER['HTTP_VIA'] != NULL){ // le ntlm ne passe pas par proxy :(

echo "Proxy bypass!";

}

elseif(isset($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Èrifie 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 header("Location: newpage.php");

exit;

}

else{

echo "NT Login empty!";

}

}

}

}

?>

--------------------------------------------------------

d'un coté si tu veut juste afficher ton login et ton nom de domaine sur cette meme page c'est à dire toto.php
alor met copie et coller cette scripte:

<?php

session_start();

$headers = apache_request_headers(); // RÈcupÈration des l'entÍtes client

if (@$_SERVER['HTTP_VIA'] != NULL){ // le ntlm ne passe pas par proxy :(

echo "Proxy bypass!";

}

elseif(isset($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Èrifie 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;

$_SESSION['name'] = $domain;

//$_SERVER["SERVER_NAME"]=$domain;

echo("$domain");

echo "\ ";

echo("$login");

//header("Location: newpage.php");

exit;

}

else{

echo "NT Login empty!";

}

}

}

}

?>

--------
VOILA sinon est ce que toi ou quelqu'un peut vraiment me dire comme on met ça POUR IIS s'il vous plaît car la j'ai la pression du boss qui me lache pas.

Entre autre aussi si quelqu'un connait dreamweaverMX ou CS3 ou 8 c'est kif kif , j'ai un petit problème avec c'est que je n'ai pas de serveur PHP ADODB pour faire une connexion PHP MS SQL en serveur d'évaluation et le modèle de serveur de chez PHAKT n'exite plus il a été acheter par adobe meme , et pourtant j'entend dire que l'outils developper toolbox d'adobe intègre déja cette serveur pourtant moi je l'ai télécharger ce developper toolbox et j'ai toujours pas PHP adodb,

R.Razafimamonjy
(www.razafimamonjy.fr) visiter mon site web et apportez en aussi vos critique dessus car j'ai pas mal de bug aussi la dessus et cliquer aussi sur les pubs s'il vous plait
corresp Messages postés 6 Date d'inscription vendredi 8 juin 2007 Statut Membre Dernière intervention 26 décembre 2008
7 déc. 2007 à 11:30
Salut Predator747
Merci pour les renseignements, mais j'ai le même genre de messages d'erreur :

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\...\www\toto.php3:1) in C:\...\www\toto.php3 on line 18

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\...\www\toto.php3:1) in C:\...\www\toto.php3 on line 18

Warning: Cannot modify header information - headers already sent by (output started at C:\...\www\toto.php3:1) in C:\...\www\toto.php3 on line 26

Warning: Cannot modify header information - headers already sent by (output started at C:\...\www\toto.php3:1) in C:\...\www\toto.php3 on line 27

toto.php3 étant le fichier dans lequel j'ai mis le script lol
predator747 Messages postés 4 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 7 décembre 2007
7 déc. 2007 à 09:27
Salut CORRESP et salut à tous,

mon config c'est
XP et IIS avec PHP

bah à la place de ton index php de ton intranet tu mets ça , et à la place de "newpage.php" dans ce script, tu mets la page accueil de ton site intranet comme "accueil.php" à la place de "newpage.php" .
Par contre, après avoir tester ce scripte tout d'abord sur apche de easyphp, j'ai du coorigé le script de sesusquad car j'ai fait directement du copier coller , donc voici les corrections pour ceux ça peux aider:
ici le script je l'ai appelller indexori.php "ori comme original, et stop de suite pour ceux ki veut faire la relation avec SG1"

Notice: Undefined index: HTTP_VIA in c:\site\indexori.php on line 22
//donc ici à la ligne 22 qu lieu de mettre if ($_SERVER['HTTP_VIA'] != NULL) // le ntlm ne passe pas par proxy :(
remplecer le par ceci: if (@$_SERVER['HTTP_VIA'] != NULL) , en rajoutant juste le arobas "@" devant la variable $_SERVER pour enlever le message d'erreur inutile.

Notice: Undefined index: Authorization in c:\site\indexori.php on line 25

// maintenant pour la ligne 25 avec:
elseif($headers['Authorization'] == NULL){ mettez plutôt ceci:
elseif(isset($headers['Authorization']) == NULL){ // ici j'ai rajouter isset
voila

et enfin pour les 2 dernières ci dessus concernant le teste NTLM :
Warning: Cannot modify header information - headers already sent by (output started at c:\site\indexori.php:22) in c:\site\indexori.php on line 26

Warning: Cannot modify header information - headers already sent by (output started at c:\site\indexori.php:22) in c:\site\indexori.php on line 27

Mettez tout simplement la ligne 44, 45 et 46, 47 en commentaire pour arreter le teste ça evite de se casser la tete avec ethereal ou firebug .... en voulant débugguer ça:
donc metter ceci :

// 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;
//}
maintenant créer une page appeller "newpage.php" pour repondre à la requête de la ligne 78 si tout est ok c'est à dire la requête:
header("Location: newpage.php");
ou au lieu de "newpage.php" mettez en votre page "accueil.php" .

dans le page "newpage.php" editer ceci en fesant "copier-coller":

<?php
echo "OK, my congratulation her GENERAL MAJOR";//c'est à dire que là ça marche et toute est ok
?>

maintenant enregistrer votre page: index.php et newpage.php dans votre site sous apache (easyphp sous windows xp ) ou (wamp sous windows xp)
et normalement si ça marche, quand vous taper dans votre URL: http://127.0.0.1/votresite/index.php, il va vous rediriger automatiquement vers la page "newpage.php"

Maintenant comme pour moi et à ceux en qui ça peut intérresser je voudrais savoir comme fait on ça sur IIS, car franchement sur Commentaire de philip_c le 26/05/2006 16:14:13 j'y ai rien compris moialors que j'ai un IIS/PHP AUSSI.

MERCI
R.Razafimamonjy
(www.razafimamonjy.fr) visiter mon site web et apportez en aussi vos critique dessus car j'ai pas mal de bug aussi la dessus
corresp Messages postés 6 Date d'inscription vendredi 8 juin 2007 Statut Membre Dernière intervention 26 décembre 2008
6 déc. 2007 à 13:38
Hello
heu j'aurais une petite question toute bête.
Je me considère comme débutant en php, mais... comment est-ce qu'on intègre ce script dans un intranet ?
Mici
predator747 Messages postés 4 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 7 décembre 2007
3 déc. 2007 à 17:09
Salut SECUSQUAD! et salut à tous

AVANT tous je tient à dire que je suis un débutant en php.

Voilà moi aussi je suis en stage pareil que Gyl59,dans une boite et en ce momment je travaille sur un projet de réfonte de leur intranet pour passer d'asp en php. Voici ma config

1 Serveur web IIS/PHP
1 Serveur de bdd MS SQLSERVER

Comme je disais précédement les pages actuels sont en asp, et en ce moment,on me demande de les changer tous en php, je raconte pas tous le boulots a faire. Mais déjà avant tout, on me demande justement de faire une authentification automatique pour les utilisateur pour leur permettre l'accès à la saisie de leur heures dans l'intranet. Auparavant ils se loguait via une pages classsique "login.asp" avec les loguin et le pass enregistrer dans ms sql.Maintenant on veut qu'il puisse y acceder automatiquement sur leur poste de travail en récupérant automatiquement leur login windows et leur pass windows , ce qui est le cas de ton script ici si j'ai bien compris.

Donc pour moi par exemple j'ai recupérer ton script là que j'ai par la suite enregistrer en login .php dans mon serveur .Mais je ne comprend pas la dedans c'est quoi alors ma page cible ? c'est quoi newpage.php ? car rien qu'en l'ayant lancer avec firefox j'obtient rien comme resultats la page se charge mais c'est complètement vide , et puis avec IE ça m'affiche :

*********************************************************
Le site Web ne peut pas afficher la page
HTTP 500
Causes les plus probables :
Le site Web est en cours de maintenance.
Le site Web présente une erreur de programmation.

Essayez la chose suivante :
Actualisez la page.

Aller à la page précédente.

Informations

Cette erreur (HTTP 500 Erreur interne au serveur) signifie que le site Web que vous visitez a rencontré un problème de serveur qui a empêché l’affichage de la page Web.

Pour plus d’informations sur les erreurs HTTP, consultez l’aide.
*********************************************************************************

Alors que j'ai pas modifier ton déjà de 1.

HELP please !!!
guyl63 Messages postés 2 Date d'inscription mercredi 3 octobre 2007 Statut Membre Dernière intervention 4 octobre 2007
4 oct. 2007 à 08:23
merci de ta réponse. J'ai déjà integré ton code dans GLPI (Gestion Libre de Parc Informatique) avec une vérification dans un ldap (active directory) et ça marche nickel. C'est pour ça que je me posais la question de la sécurité (c'est vrai que je n'avais pas tout dit ... oups :-))
Re-merci
A + Guillaume
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
3 oct. 2007 à 16:24
Ce script est juste pour l'identification de l'user, il n'y a pas dans cette version l'identification NTLM a promprement dit... (verification de validité de l'user)
On peut utiliser ce script pour personnalisé une page de l'intranet entreprise (page principale avec section compta, methode, achat ...)

Mais tu peux rajouter avec LDAP la verification complete de l'user sur les sections de ton intranet....

Une version plus poussé sera bientot disponible...

++
Nicolas
guyl63 Messages postés 2 Date d'inscription mercredi 3 octobre 2007 Statut Membre Dernière intervention 4 octobre 2007
3 oct. 2007 à 13:19
salut, ton code marche d'enfer. Juste une question : peut-il y avoir un pb de sécurité genre injecter de façon arbitraire le login d'une autre personne (detournement de apache_request_headers) et ainsi acceder à une appli web (par ex) sous le nom d'une autre personne ?
Merci.
coolboy78 Messages postés 76 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 20 novembre 2007
6 sept. 2007 à 18:20
j'ai bien regardé avec le logiciel WIRESHARK, et apparement mon serveur ne recoit pas le 3ème message, ya til un moyen pour resoudre ce pb ? ou est le point de blocage ? XP ? IE ?
coolboy78 Messages postés 76 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 20 novembre 2007
30 août 2007 à 14:35
j'ai essayé ce code sous 2000 ca marche impécable
mais sous XP dans mon entreprise, et IE me dit : impossible d'afficher la page. Y'a t-il des changements de paramètre à faire dans IE ?
coolboy78 Messages postés 76 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 20 novembre 2007
24 août 2007 à 14:20
ton code marche bien,
mais pour le pb du POST, plus rien ne marche pas chez moi meme si je remplace ton header par un location en javacsript.
kisecure Messages postés 8 Date d'inscription lundi 2 juillet 2007 Statut Membre Dernière intervention 3 juillet 2007
2 juil. 2007 à 13:10
oups j'ai dis une betise ;)
il ne faut pas mettre true mais le nom de votre serveur! :)
s'il y en a plusieurs : "serveur1,serveur2"

cordialement
Nicolas
kisecure Messages postés 8 Date d'inscription lundi 2 juillet 2007 Statut Membre Dernière intervention 3 juillet 2007
2 juil. 2007 à 10:40
Bonjour,
Sous firefox avez vous essayez :?
dans la barre d'adresse tapez :
about:config

puis allez dans le champ :
network.automatic-ntlm-auth.trusted-uris
et mettez cette valeur a : "true"

Cordialement,
Nicolas
mechouiche42100 Messages postés 25 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 11 août 2006
5 juil. 2006 à 13:59
merci
et
bonne journée a toi aussi
cs_juangab Messages postés 10 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
5 juil. 2006 à 13:45
non jcrois que c'est pas possible de faire du single sign on avec firefox.
En tt k chez moi ça marche pas non plus.

ciao, bonne fin de journée
mechouiche42100 Messages postés 25 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 11 août 2006
5 juil. 2006 à 11:39
oui mai comme je test les varibles $_SESSION['Login'] et $_SESSION['Domain'] il n'as pas besoin du mots de passe

mai il ni as pas un moyen pour que firefox renvoie automatiquement votre nom utilisateur et mot de passe comme le fait Internet Explorer?
cs_juangab Messages postés 10 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
5 juil. 2006 à 11:09
mais la fenêtre d'authentification demande aussi un mot de passe associé au login leDomaine\leLogin non?

IE récupère aussi le mot de passe utilisé pour l'authentification sur l'intranet, et il envoit avec ça la NTLM Response (challenge crypté avec le mot de passe).

Si la fenetre demande un mot de passe, il ne peut pas y avoir de problème puisque normalement il n'est connu que de l'utilisateur (à moins qu'il soit accroché sur un petit post-il en bas de l'écran, et ds ce cas, le problème ne peut pas être résolu)
mechouiche42100 Messages postés 25 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 11 août 2006
5 juil. 2006 à 09:47
salut et merci;

oui c ca avec firefox j'ai une fenetre d'authentification.
mai moi je voulai me servir de ce code pour verifier que l'utilisateur est bien sur intranet de ma boite or sous firefox il sufit de metre comme login leDomaine\leLogin et avec le domaine et le login d'une autre pesrsonne ca marche.or avec IE c'est le login et le domaine qu'il a utliser pour s'authentifier sur l'intranet qui est recupere.

Firefox ne peut pas faire la meme chose?
cs_juangab Messages postés 10 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
5 juil. 2006 à 09:18
hello,

chez moi ça marche avec firefox pour faire du ntlm (le navigateur envoi bien le message type 3 avec le login et la ntlm response), mais il c'est pas de l'authentification unique, cad que ya une fenetre d'authentification qui s'affiche pour rentrer login/mdp, alors que IE récupère le login/mdp windows tout seul (il fait de l'authentification unique -single sign on-).

Mais sinon, Firefox parle bien ntlm.

ciao
mechouiche42100 Messages postés 25 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 11 août 2006
4 juil. 2006 à 16:12
chez moi ca marche super bien avec IE mais pas avec FIREFOX.
mechouiche42100 Messages postés 25 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 11 août 2006
4 juil. 2006 à 15:58
bonjour,
ce code est super mai comment faire pour qu'il marche avec firefox?
merci.
cs_paskl13 Messages postés 1 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 7 juin 2006
7 juin 2006 à 09:54
bonjour,
j'ai copier-coller le code. apparament il recupere bien le login. seulement il ouvre une fenetre d'invite pour saisir un login et mot de passe. si je clique sur ok en laissant login et mdp vide dans l'invite, la page s'affiche et le login windows est bien recuperé. Est ce que quelqu'un comprends mon probleme et aurait une idée d'ou vient cette invite est comment l'enlever?
Merci
cs_juangab Messages postés 10 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
31 mai 2006 à 12:22
hello!

Philip_c j'avoue que je pige pas tout là...
Jcomprends pas comment tu parviens à récupérer les bonnes infos du client alors qu'il cause "Negotiate" et non pas NTLM.
Pour moi, si on ne configure pas IIS pour parler uniquement NTLM, il propose au client qui doit s'authentifier de le faire soit "en Negotiate", soit en NTLM. Le client répond alors avec Negotiate, ce qui correspond à une authentification Kerberos, carrément plus complexe que NTLM et complètement différente!
Donc jpige pas comment ça se fait que si le client cause Negotiate, tu puisses récupérer le message et tester les flags puis renvoyer un message NTLM type 2.

Y aurait-il moyen que tu m'éclaires parce que le problème m'intéresse, ça pourrait débloquer un bug que je parviens pas à régler.

Pour ceux que ça intéressent, pour forcer IIS à causer NTLM et non pas Negotiate, il faut lancer une fenêtre de commande, se placer ds D:\InetPub\Adminscript puis taper
"cscript adsutil.vbs GET w3svc/numéro_du_siteweb/root/NTAuthenticationProviders" --> ça c pour savoir ce qu'il cause (il peut répondre que la variable n'est pas définie, que la variable est "NTLM" ou que la variable est "NEGOTIATE,NTLM".
Ensuite, taper :
"cscript adsutil.vbs SET w3svc/numéro_du_siteweb/root/NTAuthenticationProviders "NTLM" " --> ça c'est pour obliger IIS à ne parler que NTLM. Dans ce cas, pas la peine de "forger" message NTLM type 2, il suffit juste de jeter le client une fois, au début, si le champ AUTHENTIFICATION n'est pas renseigné et IIS fabrique tout seul le challenge et gère l'authentifcation du client. QD le client renvoit le message 3, avec une requete GET, IIS exécte le script et on peut donc récupérer les infos.

Ptite remarque: pour connaitre le numéro du site web, il faut taper
"cscript adsutil.vbs ENUM /P W3SVC" ds Adminscript --> les num des sites web apparaissent, ds le meme ordre que ceux qu'on voit ds la petite fenetre "Gestionnaire des services Internet (IIS)".

Autre ptite remarque : si il ya eu des modifs sur la configration du serveur, ne pas oublier de l'arrêter puis de le redémarrer!

Ciao
philip_c Messages postés 10 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 26 mai 2006
26 mai 2006 à 16:14
Ok my mistake ! En réalité comme ma variable globale $_SERVER['AUTH_TYPE'] est 'Negociate' au lieu de 'NTLM', il fallait simplement adapter le code de Secusquad permettant de forcer l'authentification NTLM.
Je teste alors en début de toutes mes pages si le client possède une IP Intranet, et si il n'a pas de session PHP ouverte, dans ce cas j'inclus la page d'authentification NTLM qui me renvoi le login Active Directory du client. Je n'ai plus qu'a récupérer les infos le concernant dans AD et à afficher son espace personnel. C'est tout simplement excellent :)
Voici le code qui fonctionne donc pour moi (avec $_SERVER['AUTH_TYPE']='Negociate' à vérifier en affichant <?php phpinfo();?> ) sous IIS avec PHP.
Debut de toutes mes pages (debut-de-page.php) :

if($intra)
{
if(!$sess)
{
require_once 'ntlm.php';
if($username==false) 
{
echo "*** LOGIN incorrect  =>exit
";
   			exit;
}
else
{
//on est en intranet et une session n'est pas encore ouverte,
//j'ouvre la session et je récupère les infos Active Directory dont j'ai besoin 
//en sautant la partie d'authentification AD, puisque l'utilisateur est reconnu en NTLM
//J'ouvre donc l'accès privé avec les rubriques personnalisées de l'utilisateur AD en cours.
echo "*** AUTHENTIFICATION LDAP $username ***
";
//include the class and create a connection
include "./includes/adLDAP.php";
$adldap = new adLDAP();
$infos=array();
$infos=$adldap->user_info($username,$infos);
if($adldap->in_group($infos,"SID du groupe AD espace privé"))//groupe autorisant l'accès à l'espace personnel
{
                                //demarrage de la session PHP et enregistrement des infos
session_start();

$_SESSION['infos']=$infos;
$_SESSION['username']=$username;

                                //redirection vers l'espace personnel
                                echo "<SCRIPT LANGUAGE=JavaScript>
location='./espace-personnel.php';
</SCRIPT>";
exit;
}
}
}
}


code de la page ntlm.php :
function authentification()
{
$res=false;
function emu_getallheaders() 
{
   foreach($_SERVER as $h=>$v)
   if(ereg('HTTP_(.+)',$h,$hp))
   $headers[$hp[1]]=$v;
   return $headers;
}
$headers = emu_getallheaders();

// nous verifions si un proxy est utilisé : parceque l'identification par ntlm ne peut pas passer par un proxy
if(!isset($headers['AUTHORIZATION']))
{    
//envoi au client le mode d'identification  
header( "HTTP/1.1 401 Unauthorized" );  
header( "WWW-Authenticate: NEGOCIATE" );        
header( "WWW-Authenticate: NTLM" ); //dans notre cas le NTLM
exit;                            // on quite
}
else
{     
if(strtolower(substr($headers['AUTHORIZATION'],0,9)) == "negotiate")
{   // on vérifit que le client soit en NTLM
 //echo "
Authorization == '".strtolower(substr($headers['AUTHORIZATION'],0,9))."'
";
$chaine=$headers['AUTHORIZATION'];                  
$chaine1=substr($chaine, 10);             // recuperation du base64-encoded type1 message
$chained64=base64_decode($chaine1);      // 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); //echo $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 les information d'identification supplémentaire
exit;

}
elseif(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 la variable de retour
$res=$login;
}
else
{
$res=false;
}
}
}
}
return $res;
}

$username="";
$username = authentification();


Voilà tout fonctionne à merveille, MLKJ j'espère que ça le fera pour toi aussi ;)
Merci Secusquad en tt k ! 2 ans après on s'en sort!!! lol
philip_c Messages postés 10 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 26 mai 2006
26 mai 2006 à 12:05
Juangab je pense que le plus simple est d'utiliser le SSL pour ton site. mais je suppose que ça t'oblige à l'activer sur l'ensemble du site, puisque l'authentification NTLM se fait dès que l'utilisateur entre sur ton site, plutôt que dans une page d'authentification spécifique permettant de rentrer dans un espace privé, comme sur un extranet. Mais ça m'interesserait qd même d'utiliser ldaps donc si j'ai un peu de temps je testerai.

MLKJ Bigolf a assuré ! Merci a toi Bigolf. ça marche tres bien en fait je me suis croqué pendant un moment sur une erreur : $_SERVER['AUTH_TYPE'] renvoie NTLM si le navigateur est en IE6 ou firefox (incompatible IE5.5). Dans mon cas cette variable était toujours a 'Negociate', je pensais donc que le NTLM n'était pas utilisé ou pas correctement. Mais en lisant http://davenport.sourceforge.net/ntlm.html proposé par Juangab, on voit bien qu'une entête Negociate est utilisée à un moment donné, de plus, avec le logiciel Ethereal j'ai bien vu que les headers NTLM étaient utilisés. Pour que ça fonctionne il faut bien décocher 'Accès anonyme' dans IIS et afficher simplement une page PHP contenant <?php phpinfo(); ?> pour voir que la variable $_SERVER['AUTH_USER'] est correctement renseignée. Donc ça marche effectivement très bien pour un site purement intranet. Contacte moi en PV si tu veux des détails.

Par contre là où cela se complique c'est que mon site est un site à tout faire, c'est à dire une vitrine de l'entreprise, + un accès privé en SSL où les employés se connectent et ont accès à des fonctionnalités selon leurs groupes LDAP, et ce même site sert d'intranet où je souhaite que les utilisateurs soient reconnus en NTLM pour accéder directement à l'espace privé.
Pour cela il faut donc réactiver les connexions anonymes dans IIS et je suppose forcer l'authentification en NTLM uniquement si le client a une IP intranet, avec le tout premier script posté ici je suppose, mais c'est là que je n'arrive pas a le faire fonctionner! en effet, meme en interdisant les connexions anonymes sous IIS, la page me demande tjrs une authentification (type ntfs) pourtant j'ai les droits a ce niveau là, et meme en entrant mes identifiants dans cette fenetre, IE affiche 'Vous n'êtes pas autorisé à afficher cette page'.
Si quelqu'un a une idée... Merci.

Philip C.
cs_juangab Messages postés 10 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
24 mai 2006 à 11:20
Salut,

après avoir récupéré le login du user, je m'en sers pour récup des infos sur un annuaire avec le protocole ldap, en php.
Le truc c ke avec la fonction ldap_bind, le mot de passe pour accéder à l'annaire passe en clair!
jvoudrais donc utiliser ldaps, mais ds ce cas ldap_bind ne fonctionne plus.

PLEASE HELP

jg
cs_InTheMix Messages postés 18 Date d'inscription mercredi 18 octobre 2000 Statut Membre Dernière intervention 5 août 2009
11 mai 2006 à 10:22
Salut Juangab,

Merci pour ton explication détaillée, je vais voir ce que celà donne :)

Merci beaucoup et à bientôt :)
cs_juangab Messages postés 10 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
10 mai 2006 à 14:09
Hello,

OK donc tu fais tourner ton script sur un serveur apache si je pige bien?
Au début, j'avais aussi ce problème de flags, mais il est parti sans que je sache exactement pourquoi.

Tout ce que je peux te dire, c'est comment comprendre un peu mieux le problème, pour réussir à le régler en changeant des configs dans IE.

Ce que jte conseille, c'est de télécharger ethereal 0.10.14 sur http://www.clubic.com/telecharger-fiche11151-ethereal.html , de l'installer (en cochant "installer WinPcap 3.1") et de t'en servir: tu commence par faire une requete sur la page contenant ton script avec IExplorer; là il t'affiche "NTLM Flag error"; ensuite, tu lance ethereal; dans le champ "Filter", tu tapes "http" puis tu entrée; tu vas sur "Capture", tu cliques sur "Interface" puis sur "Capture" devant l'adresse IP dont tu te sers. Attends 10 sec qu'il y ait marqué "capturing" en bas de ton écran à la place de "no packets"; Après tu reviens sur ton navigateur et tu rafraîchis la page (cliques sur le bouton avec les 2 flèches en dessous de "Favoris"). Il te réaffiche le message d'erreur et là tu reviens sur ethereal et tu cliques sur "STOP" pour la capture. Le logiciel t'affiche alors les messages HTTP qui sont passés par ta carte réseau. Tu dois sûrement voir 4 ou 5 trames dans la fenêtre du haut. La 2ème ou 3ème doit correspondre à "GET /nom_du_script.php NTLMSSP NEGOTIATE" --> tu clik dessus, puis tu regarde dans la fenetre du milieu: t'as tous les protocoles encapsulés dans le message, ce qui t'intéresse, c'est le protocole HTTP, donc tu clique sur le + à coté de HTTP; tu vois qu'à l'intérieur ya le champ "Authorization" avec le message NTLM codé en base64, si tu clik sur le +, le message est analysé par ethereal et décodé; clik sur le + a coté de NTLMSSP, tu verras tout le message NTLM décodé, y compris les flags: il te met lesquels sont à 1 et à 0. Pour que le script marche, il faut que les flags "Negotiate Always Sign" , "Negotiate Workstation supplied" "Negotiate Domain Supplied" et "Negotiate NTLM key" soient à 1 (on a alors les bits : 10110010 soit 178 en décimal, qui correspondent au 14ème caractère du message NTLM, stocké à l'indice 13).

Voilà, tu peux recommencer autant de fois que tu veux.
Pour le fond du problème, ce que jpeux te dire c'est de: -fermer de temps en temps la fenêtre du navigateur et d'en rouvrir une autre pour refaire une requete sur le script, parce que les raffraichissements fonctionnent pas tjs bien (moi c'est comme ça, par surprise, que ça a fonctionné).
- Vérifier dans le fichier de configuration d'apache que l'option KeepAlive est ON et que la valeur de MaxKeepAliveRequests est assez élevée.

http://davenport.sourceforge.net/ntlm.html est grave bon pour piger le protocole.

Désolé pour la taille du message!

A +
cs_InTheMix Messages postés 18 Date d'inscription mercredi 18 octobre 2000 Statut Membre Dernière intervention 5 août 2009
10 mai 2006 à 12:08
Salut JuanGab,

j'utilise internet explorer 6.0 et j'ai essayé sur Easyphp 5.0 pour voir ce que ca donnait.
Je n'ai pas essayé sur firefox parce que tous les clients de l'intranet son sous internet explorer.

Merci
cs_juangab Messages postés 10 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
9 mai 2006 à 14:55
salut InTheMix,

t'utilises quoi comme navigateur? Avec Firefox ça marche pas des masses justement à cause des flags je crois, il faut utiliser Internet Explorer. J'utilise la version 5.5 et ça fonctionne, pour la version 6 aussi.
Tu fais tourner ton script sur quel type de serveur?

Ciao

jg
cs_InTheMix Messages postés 18 Date d'inscription mercredi 18 octobre 2000 Statut Membre Dernière intervention 5 août 2009
9 mai 2006 à 12:48
Bonjour,

d'après les commentaires précédents, ce script correspond à ce que je cherche.
Par contre, plusieurs personnes ont posés la question qui m'intéresse et je n'y ai vu aucune réponse.
Peut-être parce que la question est stupide (mais comme dirait Forrest Gump : "n'est stupide que la stupidité :p")

Enfin bref, j'obtiens chaque fois la mention : NTLM Flag error!
N'y connaissant rien, je me permet de demander ce que celà signifie et surtout, comment passer outre cette erreur ?

Merci d'avance
cs_juangab Messages postés 10 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
5 mai 2006 à 11:57
Kicoucou, tu bosses sur un serveur apache? qu'est-ce qu'il t'affiche? si tu connais un peu les protocoles réseau, télécharge ethereal 0.10.14 sur http://www.clubic.com/telecharger-fiche11151-ethereal.html pour voir un peu ce qu'il se passe quand tu fais une requête sur la page.
cs_juangab Messages postés 10 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
5 mai 2006 à 11:30
Hi everybody,

secusqad franchement, un énorme merci, tu m'évites de longues prises de têtes là!

J'ai réussi à faire fonctionner le script sur un serveur Apache pour un client IE, et ça marche PRESQUE sur IIS.
En fait, grâce à ethereal (analyseur de réseau), je vois les 3 messages NTLM passer sur le réseau, sans problème, pas de problème de flags, le seul bug est que j'ai beau faire un:

header("Connection: Keep-Alive");

IIS envoit quand même une en-tête HTTP connection:close (et une autre connection:keep-alive).
J'ai lu qq part que la connexion TCP entre client et serveur devait être la même à partir du message 1. Même après avoir activer l'option "Connexions persistantes" sur IIS, l'en-tete connection close est tjs émise.

Quelqu'un sait-il comment bloquer l'émission d'une en-tete en PHP ?
Ou comment régler ce problème, si c bien ça le bug?

juan
cs_Kicoucou Messages postés 1 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 28 mars 2006
28 mars 2006 à 08:22
Bonjour,

Je suis étudiant et je dois faire un stage dans 1 entreprise pour avoir mon diplôme.
L'entreprise veut que je crée un portail<> dont le code serait en PHP qui identiferait le nom d'utilisateur<<Windows>>quant il se connecte sur la page.
Donc l'utlisateur aurait alors à disposition tous les infos qui lui concerne.
Exemple: je me connecte sur la page j'aurai tous mes informations sur les incidents que j'ai eu.
J'ai fait la partie pour me connecter sur la base et récupérer tous le donnée de la table.
Maintenant il me manques juste de récuperer le nom de l'utilisateur de windows quand il se connecte sur la page des incident pour qu'il puisse avoir juste ces informations a lui et pas les information des autres personnes.
J'ai vu vos codes pour récuperer le nom de l'utilisateur et je n'arrive pas a le faire fonctionner.Je suis vraiment perdu je ne sais plus quoi faire est-ce quelqu'un pour m'aider
J'espère que j'ai bien reussi a m'expliquer.
Je vous remerci d'avance
Kicou
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
6 févr. 2006 à 01:28
Merci BIGOLF,

Je vais tester ça dès que possible


MLKJ9876

PS: philip_c tu m'informes de tes tests stp??
cs_bigolf Messages postés 3 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 4 février 2006
4 févr. 2006 à 22:38
Voici le tutorial ou j'ai trouvé comment procéder sour IIS (Un grand bravo à son créateur !!) : http://fromelard.free.fr/Scripts/ASPNET_IntranetSecure/ASPNET_IntranetSecure.pdf

Suivi à la lettre, cela fonctionne a merveille.
1- Créez votre site selon le tutorial
2- faites un phpinfo ds ce site : regardez les variables $_SERVER['AUTH_TYPE'] et $_SERVER['AUTH_USER']
$_SERVER['AUTH_TYPE'] renvoie NTLM si le navigateur est en IE6 ou firefox (incompatible IE5.5)
$_SERVER['AUTH_USER'] renvoie le login windows du visiteur sur votre page
(evidemment le ntlm n'est transmis que sur les zone de confiance = zone intranet)


Voici la fonction que j'appelle au debut de chaque page pour recuperer le login.
Si FALSE ==> c que le visiteur n'est pas identifiable
function authentification(){

if ($_SERVER['AUTH_TYPE']!="NTLM"){
echo "L'authentification envoyée par votre navigateur est incorrecte.
. Impossible de vous authentifier.

";
return FALSE;
}


if (ereg("^MONDOMAINE[\\]([a-zA-Z].)*",$_SERVER['AUTH_USER'])){
$login=ereg_replace("^MONDOMAINE[\\]([a-zA-Z].*)$","\\1",$_SERVER['AUTH_USER']);
#echo " &nbsp Profil connecté :  ".$login." 
";

return strtoupper($login) ;
}else{
#echo " &nbsp L'identifiant ne correspond pas à une syntaxe correcte.
";
return FALSE ;
}

}


J'ai mis cela en place pour une société possédant 2 domaines : possibilité de filtre pour autoriser UN seul domaine.
Et le login du personnel connecté est récupéré et controlé en début de chaque page php par :
$login = authentification();
if (login=FALSE) {
   exit()
}else{
  echo "Bonjour ".$login;
}


Conclusion :
- Pour IIS et les intranet d'entreprise, rien de plus facile : suivre le tutorial (testé, 300 utilisateurs par jour ;)
- Pour apache : la solution est sur cette page :)

Bon courage à tous.
Flooo
cs_Straasha Messages postés 6 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 22 novembre 2005
3 févr. 2006 à 15:47
Au fait... pourquoi cela fonctionne avec Firefox alors ? C'est qu'il y a bien un truc pour IE ?
cs_Straasha Messages postés 6 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 22 novembre 2005
3 févr. 2006 à 15:15
Oui j'ai vu ca, et en passant merci pour ton script... Mais apparement ca doit être possible en renvoyant des headers ensuite...

Le problème est corrigé avec un header("WWW-Authenticate: Basic");

Ayant du mal avec ces derniers, j'ai toujours une fenêtre d'authentification où je n'ai qu'à faire un cancel pour que ca fonctionne.

Enfin je ne sais pas si vous comprennez mon charabia, mais pour mon intranet, mon index.php comporte une identification NTLM, derrière un cookie de session est créé puis vérifié sur chaque page du site.
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
3 févr. 2006 à 13:32
* UTILISATION DE POST et GET ?

Il n'est pas possible d'utiliser POST et GET avec ce script. Par contre vous pouvez utiliser les variables de session afin d'identifier vos utilisateurs.
Cette limitation est due au fonctionnement du protocole NTLM qui réalise un nombre successif de requette afin de pouvoir établire une communication client/serveur.

req 1: C --> S GET. ..
C <-- S 401 Unauthorized WWW-Authenticate: NTLM

req 2: C --> S GET. ..Authorization: NTLM. ......
C <-- S 401 Unauthorized WWW-Authenticate: NTLM. .....

req 3: C --> S GET. ...Authorization: NTLM. .....
C <-- S 200 Ok
cs_Straasha Messages postés 6 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 22 novembre 2005
3 févr. 2006 à 08:31
Héhé merci les gars mais aucun ne répond à ma question :D
J'utilise Apache Biensur !!!
philip_c Messages postés 10 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 26 mai 2006
2 févr. 2006 à 15:58
Oui je suis d'accord avec MLKJ ! Envoi le ragout Bigolf ! :D
J'en rêve de ce script ça faciliterai la vie de toute l'entreprise...
Si tu peux nous préciser la config de IIS et les subtilités du code qu'on aurait pu ommettre quand tu as le tps ça serait cool ;)
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
1 févr. 2006 à 23:55
Bigolf,

"Pour IIS rien de plus simple : c'est une option a cocher dans ton site virtuel." - laquelle please?

"je posterai plus de sources si tu le souhaites (une simple fonction "authentification")" - je le souhaite si tu le peux

"En tout cas garanti à 100% facile sous iis :)" - Je serais ravi de voir ça, ça me dépannerais beaucoup

MLKJ9876
cs_bigolf Messages postés 3 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 4 février 2006
1 févr. 2006 à 23:25
Salut Philip_C !

Pour IIS rien de plus simple : c'est une option a cocher dans ton site virtuel.
Par contre seulement IE 6 fonctionne directement (pour les sites inscrits en "zone intranet - zone de confiance")
Sinon utiliser firefox, qui demande login /mdp (celui du compte windows. Il est revalidé aupres du controleur de domaine (voir les options de securité dans ta conf de iis)

Pour recuperer le login c'est NTLM_LOGIN (de tete ... et il est tard) : une variable d'environnement (tu la retrouve en faisant un phpinfo)
je posterai plus de sources si tu le souhaites (une simple fonction "authentification")

En tout cas garanti à 100% facile sous iis :)
philip_c Messages postés 10 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 26 mai 2006
1 févr. 2006 à 09:58
Salut Straasha, utilises tu IIS ou Apache pour ce script ? Car je n'ai pas réussi à le faire fonctionner sous IIS, je serais donc interessé si tu utilises IIS mais j'en doutes déjà. :)
cs_Straasha Messages postés 6 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 22 novembre 2005
1 févr. 2006 à 09:54
Excellent script qui fonctionne parfaitement.
Par contre j'ai le problème de la méthode POST.

Personne n'a de news à ce sujet ? Un truc marrant c'est que le problème n'existe pas sous Firefox mais seulement avec IE.
croot Messages postés 1 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 17 janvier 2006
17 janv. 2006 à 21:35
bravo pour le script,
mais, lorsque j'éxécute un session_destroy() en php, après l'authentification NTLM, plus aucune variable POST ne passe par mes formulaires alors que si je ferme IE,le relance tout refonctionne à merveille.

qqn a une idée ?
tabluoskk Messages postés 1 Date d'inscription vendredi 21 octobre 2005 Statut Membre Dernière intervention 23 novembre 2005
23 nov. 2005 à 10:49
Salut... J'aimerai bien utilisé c code mais à chaque fois il me met le message suivant : NTLM Flag error!
Quelqu'un sait Pourquoi?? AIdez moi SVP
cs_bigolf Messages postés 3 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 4 février 2006
21 nov. 2005 à 17:39
Idem que mlkj9876 ! (salut a lui ;)

J'ai lutté pour introduire le module php sous le IIS au boulot, donc je cherche déserpérément à faire fonctionner ce merveilleux script...

Je me permets simplement de relancer...

Merci pour ce script
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
21 sept. 2005 à 15:26
je ne m'en sors pas, j'ai beau retourné le problèeme dans tous les sens, modifé le script comme je peux (et Dieu seul sait qu'il est simple et clair et bien écri - féliciation secusqad) je n'arrive pas a identifié mon user avec iis, je suis preneur pour toute nouvelle idée

mlkj9876

PS: cela pourrait-il provenir d'un paramétrage de iis ?
PS2: impossible de se passer de iis dans ma boite, déjà que le php s'était limite...
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
16 sept. 2005 à 21:28
thank you philip je regarde ça

mlkj9876
philip_c Messages postés 10 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 26 mai 2006
16 sept. 2005 à 10:21
pardon j'ai oublié le lien vers Curl ! :p

http://curl.haxx.se/
philip_c Messages postés 10 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 26 mai 2006
16 sept. 2005 à 10:19
oui Curl est un outil executable sous forme de ligne de commande, qui peut etre appelé sous PHP par des fonction intégrées. Son but est de gérer tous types de transfert via URL, que ce soit sous le protocole HTTP, HTTPS, FTP... on peut entre autre envoyer automatiquement des fichiers sur un serveur de son choix, envoyer des données à une page comme si l'on utilisait un formulaire et la méthode POST etc...
C'est très utile, facile a installer et ça permet egalement l'authentification NTLM, mais uniquement en passant apparement username et password dans la fonction comme ceci :

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://localhost/site1/pagecible.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_USERPWD, "user:pass");
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_exec($ch);
curl_close($ch);
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
15 sept. 2005 à 16:54
Moi aussi au bureau nous travaillons sous iis et pas question d'avoir deux serveurs
J'ai aussi trouvé des méthodes pour récup les headers mais j'ai beau les triturer dans tous les sens, je n'arrive pas à les adapter à ce script je reçois aussi l'erreur de philippe.

function read_headers($url)
{
$url_info = parse_url($url);
$port = isset($url_info['port']) ? $url_info['port'] : 80;
$fp = @fsockopen($url_info['host'], $port, $errno, $errstr, 30);
if (!$fp)
return false;// erreur fsockopen

$head = 'HEAD '.@$url_info['path'];
$head .= '?'.@$url_info['query'];
$head .= " HTTP/1.0\r\nHost: ".@$url_info['host']."\r\n\r\n";
fputs($fp, $head);
while (!feof($fp))
{
if ($header = trim(fgets($fp, 1024)))
{
$key = array_shift(explode(':', $header));
if($key == $header)
$headers[] = $header;
else
$headers[$key] = substr($header, strlen($key) + 2);
unset($key);
}
}

if (isset($headers['Location']) && (substr($headers['Location'], -1) == '?'))
$headers['Location'] = substr($headers['Location'], 0, -1);

return $headers;
}

$headers=read_headers('http://www.phpcs.com/code.aspx?id=25272');

ou tout simplement

$headers = get_headers($url,1);

Philippe qu'est-ce que Curl? Puis-je en bénéficier?

Quelqu'un aurai une nouvelle piste?

Merci
mlkj9876
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
15 sept. 2005 à 16:54
Moi aussi au bureau nous travaillons sous iis et pas question d'avoir deux serveurs
J'ai aussi trouvé des méthodes pour récup les headers mais j'ai beau les triturer dans tous les sens, je n'arrive pas à les adapter à ce script je reçois aussi l'erreur de philippe.

function read_headers($url)
{
$url_info = parse_url($url);
$port = isset($url_info['port']) ? $url_info['port'] : 80;
$fp = @fsockopen($url_info['host'], $port, $errno, $errstr, 30);
if (!$fp)
return false;// erreur fsockopen

$head = 'HEAD '.@$url_info['path'];
$head .= '?'.@$url_info['query'];
$head .= " HTTP/1.0\r\nHost: ".@$url_info['host']."\r\n\r\n";
fputs($fp, $head);
while (!feof($fp))
{
if ($header = trim(fgets($fp, 1024)))
{
$key = array_shift(explode(':', $header));
if($key == $header)
$headers[] = $header;
else
$headers[$key] = substr($header, strlen($key) + 2);
unset($key);
}
}

if (isset($headers['Location']) && (substr($headers['Location'], -1) == '?'))
$headers['Location'] = substr($headers['Location'], 0, -1);

return $headers;
}

$headers=read_headers('http://www.phpcs.com/code.aspx?id=25272');

ou tout simplement

$headers = get_headers($url,1);

Philippe qu'est-ce que Curl? Puis-je en bénéficier?

Quelqu'un aurai une nouvelle piste?

Merci
mlkj9876
cs_chris48 Messages postés 1 Date d'inscription mardi 13 septembre 2005 Statut Membre Dernière intervention 13 septembre 2005
13 sept. 2005 à 11:54
Bonjuors, je m'excuse pour le français, mais ma langue maternelle est l'italien.

J'ai essaie le script et je recoit toujours le message NTLM Flag error!
Quelle est la raison? qu'est ce que peut faire pour resoudre le problème?

Merci
philip_c Messages postés 10 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 26 mai 2006
12 sept. 2005 à 10:17
Moi au bureau on est uniquement sous Microsoft, donc tous nos sites sous IIS, c'est hors de question que l'on installe 2 serveurs web donc... on fait du PHP sous IIS.
mlkj9876 voici la fonction que j'ai trouvée pour récuperer les Headers sous IIS :
// Récupération des entêtes client
function emu_getallheaders() {
foreach($_SERVER as $h=>$v)
if(ereg('HTTP_(.+)',$h,$hp))
$headers[$hp[1]]=$v;
return $headers;
}
$headers = emu_getallheaders();

Par contre même avec ça, IIS ne récupère pas l'utilisateur Windows actuel pour l'authentifier automatiquement en NTLM par cette page PHP. Ca me donne page introuvable au moment où on force l'authentification NTLM en modifiant les Headers.

Du coup j'ai installé Curl qui propose une fonction d'authentification NTLM, là ça fonctionne si je passe en paramètre un nom d'utilisateur et mot de passe Active Directory valide. Sinon ça plante pareil, ça ne recupère pas les info de l'utilisateur courant. Je ne connais pas trop NTLM alors c'est normal, pas normal? :)
Merci de m'éclairer et de me dire s'il faut que je trouve d'abord un moyen de recup Username et Password de l'utilisateur courant pour l'envoyer à la fonction de connexion NTLM? ou si normalement IIS ou Apache se débrouille de recup ces infos tout seul ??

Merci
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
11 sept. 2005 à 00:58
si tu peux mais en modifiant le code source, mais bon pourquoi utiliser du PHP sous IIS?
Si tu n'as pas de réel raison, passe sous un environnement Apache+PHP+mysql c'est bien mieux :)

Nicolas.
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
7 sept. 2005 à 13:54
okayyyyyyy
donc je ne peux utiliser cette méthode sous IIS?
mlkj9876
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
6 sept. 2005 à 21:47
pfff suffit de traduire, meme un traducteur en ligne te le dira : il ne reconnait pas ta fonction apache_request_headers() donc tu dois le lancer sous IIS je pense.
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
6 sept. 2005 à 21:28
Salut tous le monde,
j'obtiens ce message d'erreur quand je lance le script:
"Fatal error: Call to undefined function apache_request_headers() in c:\Inetpub\wwwroot\test\index.php on line..."
Est-ce que quelqu'un peut me dire d'ou ça vient et comment le régler?

mlkj9876
philip_c Messages postés 10 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 26 mai 2006
30 août 2005 à 18:03
Salut !
j'essaye de mettre ça en place sur IIS mais je lutte :s
c'est exactement ce qu'il me faut pour mon site intranet personnalisé type SSO (single sign on)!!

Mais arrivé à la ligne de code :
header( "HTTP/1.0 401 Unauthorized" );
IIS me renvoi une page erreur : HTTP 404 - Fichier introuvable
Pourtant j'ai utilisé une fonction perso au debut du code qui recupere tous les Headers pour remplacer la fonction apache_request_headers().
J'ai essayé en activant l'option IIS authentification windows, en desactivant les connexions anonymes mais meme resultat...
Any idea ?? Please aidez moi :)
Merci
Gyl59 Messages postés 1 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 juillet 2005
21 juil. 2005 à 12:02
Bonjour à tous,
j'ai toujours le probléme de reconnaissances des variables par get et post. Pouvez-vous me donner la solution car mon stage se termine dans un semaine et je bloque !!!!
Merci.
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
30 mai 2005 à 17:10
maestrox66 :
Tu dois mettre un @ dans le test du proxy! afin de ne pas affciher de msg erreur lorsque la variable est vide :
if ($_SERVER['HTTP_VIA']
en if (@$_SERVER['HTTP_VIA']

ou tu prend la fonction isset() :=)
Nicolas.
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
27 mai 2005 à 11:36
Le problème vient de la ligne 6 ou environ. Tu as du commencé à afficher du html (soit tu as écrit, soit ça a généré un message d'erreur, qui dit message d'erreur affiché dis html).
L'entete d'une page sert a contenir divers infos sur la page. une fois du html affiché, les entetes sont immodifiables. C'est pour ça qu'en général les modifications d'entete sont placé en haut du script.
maestrox66 Messages postés 1 Date d'inscription jeudi 12 mai 2005 Statut Membre Dernière intervention 27 mai 2005
27 mai 2005 à 11:29
Salut,
J'ai un problème avec le script que j'utilise sous Windows 2000 pour un intranet, j'ai toujours la même erreur :

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/_test/juju/index.php:6) in /var/www/html/_test/juju/index.php on line 23

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/_test/juju/index.php:6) in /var/www/html/_test/juju/index.php on line 24

Les lignes 23 et 24 sont :
header( "HTTP/1.0 401 Unauthorized" );
header( "WWW-Authenticate: NTLM" );

De l'aide SVP
Juju
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
12 mai 2005 à 01:44
=> pour les mise à jour de ce script veuillez vous connecter sur :
http://www.secusquad.com/ntlm/
:)

Nicolas.
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
4 mai 2005 à 15:12
Le petit probleme (enfin chez moi lol) c'est que si je fais une identification ntlm, les $_POST et $_FILES reste toujours vide. Par contre $_GET passe toujours.

Explication : Vous avez une page php avec ce code.
<?php
print_r($_FILES);
?>
<form action="" method="post" enctype="multipart/form-data" name="form1">


</form>

Si vous accédez direct à la page, vous pouvez uploader un fichier sans PB. Si vous accédez à une page avec une identification NTLM et à cette page juste aprés, l'upload (ou le post, suivant le cas) est impossible.

Je continu a chercher, si je trouve le pourquoi du comment je post ici ^^
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
22 avril 2005 à 14:27
Joli bout de code
10/10 ^^
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
1 mars 2005 à 22:56
Merci a tous pour vos commentaires ;)
effectivement il faut faire une petite conversion pour le login sinon ca peut posé des problème ;)

A++
Nicolas
boolrog Messages postés 1 Date d'inscription dimanche 12 janvier 2003 Statut Membre Dernière intervention 18 février 2005
18 févr. 2005 à 09:59
Merci beaucoup pour ce petit code bien utile, on ma demandé de migrer sur asp pour le NTLM, du coup pas besoin et le PHP perdure.
Un petit ajout par rapport a la fin qui te fais un chaine du type
$login="b\0o\0o\0r\0o\0g"; en réalité.
Donc il remet simplement la chaine normalement.

Merci encore


$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 = substr($chained64, $offset_domain, $lenght_domain); // decoupage du du domain
$domain=str_replace("\0","",$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.
$log = trim(substr($chained64, $offset_login, $lenght_login)); // decoupage du login
$login=str_replace("\0","",$log);

// l'host
$lenght_host = (ord($chained64[47])*256 + ord($chained64[46])); // longueur de l'host.
$offset_host = (ord($chained64[49])*256 + ord($chained64[48])); // position de l'host.
$host = substr($chained64, $offset_host, $lenght_host); // decoupage du l'host
$host=str_replace("\0","",$host);
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 4
13 nov. 2004 à 19:28
Pour loic
"depuis que l'insertion dans ma premier page, je narrive plus à recuperer le contenu de mes variables"

J'avais le même pb , j'ai rajouté çà à la fin du fichier et c'est ok

echo "
host is : $host";
header( "HTTP/1.0 401 Unauthorized" ); // ligne ajoutée


Merçi Nicolas , super source !
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
28 oct. 2004 à 02:02
heu...
Affiché 955 et pas une seul note?
Allez noté moi ca ;)

lol
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
28 oct. 2004 à 02:00
loic, peut etre à cause du apache_request_headers() ?
voir http://fr2.php.net/manual/fr/function.getallheaders.php

;)

Pour la prochaine version il faudra encore attendre un peut ...
j'ai pas trop le temp en ce moment ...
cs_loic_a Messages postés 1 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 20 octobre 2004
20 oct. 2004 à 14:25
Super le script, mais depuis que l'insertion dans ma premier page, je narrive plus à recuperer le contenu de mes variables. Quelq'un à une idée ?
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
22 août 2004 à 17:53
on pourais donne le login de facon manuelle :( (pas glop) par exepmle avec :
http://login:pswbidon@192.168.1.1/phpgetlogin.php

Qu'entends-tu par là secusquad? je ne suis pas sûr de te suivre.
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
22 août 2004 à 16:23
Heu...Le NTLM marche tres bien avec Windows NT4, 2000, et XP...
Par contre avec windows 98 je ne sais pas si cela marche pareil... je finis mon tutoriel et je test ton windows 98 ;)

en faite le (ord($chained64[13]) = 130) c'est un controle que le navigateur soit bien en mode 'NTLM' si cette verification n'est pas faite, on pourais donne le login de facon manuelle :( (pas glop) par exepmle avec :
http://login:pswbidon@192.168.1.1/phpgetlogin.php

++
Nicolas
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
22 août 2004 à 16:23
Heu...Le NTLM marche tres bien avec Windows NT4, 2000, et XP...
Par contre avec windows 98 je ne sais pas si cela marche pareil... je finis mon tutoriel et je test ton windows 98 ;)

en faite le (ord($chained64[13]) = 130) c'est un controle que le navigateur soit bien en mode 'NTLM' si cette verification n'est pas faite, on pourais donne le login de facon manuelle :( (pas glop) par exepmle avec :
http://login:pswbidon@192.168.1.1/phpgetlogin.php

++
Nicolas
mlkj9876 Messages postés 12 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 6 février 2006
20 août 2004 à 15:43
que le grand kric me croque si c'est pas une source qui déchire ça?!!!
Franchement c'est du joli, cela fait des jours et des jours que je recherche un moyen de récupérer le login windows de mes utilisateurs intranet, bravo secusqad.
Par contre j'ai le message "Votre navigateur Internet n'est pas compatible avec le NTLM, utiliser IE...Merci" (ord($chained64[13]) = 130) pour un poste win98 ie5
mais pour les postes nt et 2000 ça marche du tonnerre
Est-ce que quelqu'un saurait m'expliquer pourquoi ainsi je pourrais rectifier le problème.

mlkj9876
cs_glad Messages postés 97 Date d'inscription lundi 26 novembre 2001 Statut Membre Dernière intervention 24 février 2012
12 août 2004 à 10:13
Heu merci
merci
merci :)
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
12 août 2004 à 10:08
Glad,
Va voir sur http://msdn.microsoft.com/library/FRE/vsent7/html/vxconIISAuthentication.asp
tu as une doc explicatif de l'integration du NTLM/Kerberos dans IIS :)
Sinon je pense que mon code est transcrivable en ASP ;) enfin dans tout les cas il marche aussi sous IIS/PHP :)

Nicolas.
cs_glad Messages postés 97 Date d'inscription lundi 26 novembre 2001 Statut Membre Dernière intervention 24 février 2012
12 août 2004 à 08:39
Snif, c'est sympa, mais ds ma boite on travaille sous IIS ... T'aurais pas la même chose pour IIS à tout hasard ?
Salut.
secusquad Messages postés 12 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 3 octobre 2007
11 août 2004 à 17:23
Je sais bien mais c pour bien comprendre le message de reponse envoie du serveur vers le client ;);)
je l'ai decomposé exeupré :)
Je vais bientot posté la nouvelle version avec tutoriel :)
Nicolas
derfum Messages postés 45 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 5 septembre 2004
10 août 2004 à 11:33
$retAuth .= chr(0);
$retAuth .= chr(2);
[...]
$retAuth .= chr(0);
$retAuth .= chr(0);
Y'a pas moyen de faire plus court ?
Sinon je peux rien dire de plus c au dessus de mes compétences ! ^_^
Rejoignez-nous