$_POST vide.

Mammouth du PHP | 2937 Messages

31 août 2009, 13:36

Edit: En copiant-collant tous mes fichiers php sur un autre serveur, tout marche parfaitement... il y a donc bien un probleme de configuration au niveau de ce serveur, mais quoi ?
Au niveau de la directive register_globals ? :-k

Eléphanteau du PHP | 20 Messages

31 août 2009, 14:49

"register_globals = Off"

J'essaie de la passer en "On" pour voir.

Edit: aucune différence.

Eléphanteau du PHP | 20 Messages

01 sept. 2009, 09:11

Je viens de trouver la source du problème, mais j'aurais encore besoin d'aide pour le regler.

En effet, le portail que je développe est pour un intranet, j'include donc un script (trouvé sur internet) pour récupérer le login Windows de la personne qui arrive sur la page, pour qu'elle n'aie pas besoin de se logguer, et j'ai donc trouvé que c'était justement ce script qui vidait mes variables $_POST et $_FILES.

Le problème est que, je ne vois pas d'où vient le problème, peut-etre pourriez-vous m'aider?
Voilà le script :
<?php
session_start();
$headers = apache_request_headers(); // Récupération des l'entêtes client

 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)
	 $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;
		 }
	 }
 }
 } 
?>
Il remplit bien sa fonction, à savoir : récupérer le login windows de la personne qui visite la page. Mais une fois exécuté, plus moyen de récupérer les valeurs de $_POST et $_FILES.

Edit: Apparement c'est le 'WWW-Authenticate: NTLM' qui pose problème... je ne sais pas s'il existe un moyen de contourner ca.

Eléphant du PHP | 369 Messages

01 sept. 2009, 10:00

Je viens de trouver la source du problème, mais j'aurais encore besoin d'aide pour le regler.

En effet, le portail que je développe est pour un intranet, j'include donc un script (trouvé sur internet) pour récupérer le login Windows de la personne qui arrive sur la page, pour qu'elle n'aie pas besoin de se logguer, et j'ai donc trouvé que c'était justement ce script qui vidait mes variables $_POST et $_FILES.

Le problème est que, je ne vois pas d'où vient le problème, peut-etre pourriez-vous m'aider?
Voilà le script :
<?php
session_start();
$headers = apache_request_headers(); // Récupération des l'entêtes client

 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)
	 $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;
		 }
	 }
 }
 } 
?>
Il remplit bien sa fonction, à savoir : récupérer le login windows de la personne qui visite la page. Mais une fois exécuté, plus moyen de récupérer les valeurs de $_POST et $_FILES.
Sauvegarde tes valeurs dans la session:
// --- Le principe mais peu conseillé de cette manière !
//
$_SESSION[get] = serialize($_GET);
$_SESSION[post] = serialize($_POST);
$_SESSION[files] = serialize($_FILES);
$_SESSION[xxx] = ...;
Ce qui est conseillé, en revanche, s'est d'enregistrer dans une table les infos que tu veux sauvegarder
comme (GET, POST, FILES, le Login, etc), avec comme id (PRIMARY_KEY) l'id de session. Ainsi, ca
te permetra de récupérer les infos voulues.

'fin pour ce que tu veux sauvegarder, de pages en pages, tu te sert des sessions
Je sais, je suis peu clair mais c'est le matin, un peu de compassion, stp lol

@+ ;)
Modifié en dernier par FuZZyLine le 01 sept. 2009, 10:28, modifié 1 fois.

Eléphanteau du PHP | 20 Messages

01 sept. 2009, 10:04

Je sais, je suis peu clair mais c'est le matin, un peu de compassion, stp lol
Non non, c'est très clair, merci :)
Je ne savais pas qu'on pouvais enregistrer $_FILES aussi dans $_SESSION, je vais aller tester tout çà!

Edit: euuh.. par contre, c'est à quel moment que j'enregistre toutes mes variables dans la session? Au moment de l'envoi du formulaire? Ou bien dans le script qui récupère le login?

Eléphant du PHP | 369 Messages

01 sept. 2009, 10:27

Edit: euuh.. par contre, c'est à quel moment que j'enregistre toutes mes variables dans la session? Au moment de l'envoi du formulaire? Ou bien dans le script qui récupère le login?
A la réception du formulaire, quand tu as toutes les infos.

Attention: Tu ne peux mémoriser un tableau ou un objet sans sérialiser d'ou la fonction: serialize(xxx).
Pour récupérer tableaux et objets te suffit d'utiliser la fonction inverse qui est: unserialize(xxx).

Dans cette approche tu as aussi les fonctions : __sleep et __wakeup
http://www.manuelphp.com/php/language.o ... ctions.php

@+ ;)

Eléphanteau du PHP | 20 Messages

01 sept. 2009, 10:28

Le problème est qu'à la réception du formulaire: $_POST et $_FILES sont vides, je risque donc de serializer et d'enregistrer des tableaux vides, non?

Mammouth du PHP | 568 Messages

01 sept. 2009, 11:18

Ton problème ne proviendrait tout simplement pas dudit fichier de récupération du loggin Windows qui est appelé sur chaque page?

Si ta page de recupération du loggin est effectivement appelé a chaque chargement de page, tu aura beau faire tout ce que tu veux tes variables de formulaires seront toujours vides puisque ta page redirige tout le temps.

Je te conseille d'essayer de mettre en SESSION le loggin Windows seulement lors du premier logg de l'utilisateur ensuite tu n'inclut plus le fichier de récupération.

Vérifie tous ça.

Eléphanteau du PHP | 20 Messages

01 sept. 2009, 11:29

Code : Tout sélectionner

Ton problème ne proviendrait tout simplement pas dudit fichier de récupération du loggin Windows qui est appelé sur chaque page?
Si, si, justement c'est ce que je disais un peu plus haut. Le problème provient avec certitude de ce fichier.
Mais il n'est pas appelé à chaque, uniquement à la première.

Code : Tout sélectionner

Si ta page de recupération du loggin est effectivement appelé a chaque chargement de page
Ben non, justement, c'est ca qui m'étonne.

En gros elle est incluse uniquement dans "index.php". Le formulaire est dans ajout.php, et la réception du formulaire est dans savenote.php.
Pourtant, cela affecte toutes les pages, dès que j'include le script de récupération du login à l'index, surement à cause du WWW-Authentication: NTLM.
Il faudrais pouvoir rechanger ce paramètre une fois le login récupéré.

Edit: J'ai trouvé une solution partielle:
En ajoutant : header('WWW-Authenticate: Negotiate') sur les autres pages, le problème est résolu, mais il m'affiche une fenetre de login windows, et je suis obligé de cliquer sur "Annuler" à chaque page. Mais, ca fonctionne...

Eléphant du PHP | 369 Messages

01 sept. 2009, 14:34

RE,

Et si tu essayais ceci:

index.php
session_start();

// Variable pour le script html
//
$cde = "";

$cde .= "<!DOCTYPE ...>\n";
$cde .= "<html>\n";
.
.
.

// Si ta page provient d'un formulaire
//
if (isset($_POST[form]))
{
   // La page précédente était LE formulaire, on test les éléments

   // Flag de réussite sur le test des éléments.
   //
   $bfForm = false / true
   .
   .
   .
   // Si tes éléments sont incorrects on détruit l'élément post en gardant les autres
   //
   if (!$bfForm)
   {
      unset($_POST[form]);
      header("Location:./index.php");
   }

   // Tes éléments sont corrects, alors dernier test (c'est si tu acceptes un user inconnu)
   //
   if($_POST[login] == ...) $_SESSION[login] = $_POST[login];
   else $_SESSION[login] = "Unknow";

   // Ici, Le form est passé, les éléments sont corrects donc:
   // A toi de sauvegarder les datas dans une session (en sérialisant), Dans une DB, etc...

   // Je te laisse effectuer plus avant les vérifications... ;)
   .
   .
   .
   $cde = "Votre formulaire à bien été...";
}

// Si tu n'es pas encore passé par le formulaire et qu'aucun "login" n'est déclaré
//
if (!isset($_SESSION[nom]) && isset($_POST[form])
{
   // En admétant que le formulaire soit dans un fichier à inclure
   //
   if (!file_exists($fileName)) die("Le fichier n'existe pas !");
   require_once("./".$fileName);

   // $_POST[form] n'existe pas mais il est possible que d'autres éléments soient présents.
   // on lance la fonction (à toi de la créer) getForm() OU le nom que tu veux
   //
   $form = getForm($_POST);
   .
   .
   .
   $cde .= $form;  
}

// Suivi de la page index.php 
.
.
.
$cde ."</html>\n";
echo $cde;
Cela dit, ce n'est qu'une piste, pas forcément ce que tu recherches mais...
peut-être que ca peut t'aider.
Et biensur, assure toi de: Poser les header anti-cache. etc...

@+ ;)

PS: Je crois avoir fait le tour et essayé d'être le plus clair possible... 'fin je crois ;)

ViPHP
AB
ViPHP | 5818 Messages

01 sept. 2009, 15:59

Edit: euuh.. par contre, c'est à quel moment que j'enregistre toutes mes variables dans la session? Au moment de l'envoi du formulaire? Ou bien dans le script qui récupère le login?
A la réception du formulaire, quand tu as toutes les infos.

Attention: Tu ne peux mémoriser un tableau ou un objet sans sérialiser d'ou la fonction: serialize(xxx).
Pour récupérer tableaux et objets te suffit d'utiliser la fonction inverse qui est: unserialize(xxx).

Dans cette approche tu as aussi les fonctions : __sleep et __wakeup
http://www.manuelphp.com/php/language.o ... ctions.php

@+ ;)
Et depuis quand on ne pourrait pas mémoriser un tableau directement dans une variable de session ?
$_SESSION['post'] = $_POST;
echo '<pre>';
print_r($_SESSION['post']);
echo '<pre/>';

Eléphant du PHP | 369 Messages

01 sept. 2009, 16:06

Salut,
Et depuis quand on ne pourrait pas mémoriser un tableau directement dans une variable de session ?
$_SESSION['post'] = $_POST;
echo '<pre>';
print_r($_SESSION['post']);
echo '<pre/>';
Peut-être parceque c'est pas "super" propre, mais je cherche la petite bête ;)

@+ ;)

Petit nouveau ! | 1 Messages

02 nov. 2009, 10:45

Salut,

J'ai trouvé la réponse à ton problème "sans bidouiller", car j'avais également le même problème, voici ta solution :
Dans ton script à cet endroit il faut rajouter une ligne et tout sera réglé (enfin je suis encore en cours de test mais ça à l'air de bien marcher chez moi) :
 if ( $login != NULL){
                 // stockage des données dans des variable de session
                        $_SESSION['Login']=$login;
                        header('WWW-Authenticate: None'); // nécessaire pour que $_POST ne soit pas vide
        }
Voilà j'espère que cela t'aura aider, même si la solution viens un peu tard...

Eléphanteau du PHP | 20 Messages

02 nov. 2009, 11:41

Merci beaucoup.
Il n'est jamais trop tard pour améliorer un script :)

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

03 nov. 2009, 10:31

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton Image en haut à droite de la réponse qui te semble la plus pertinente.
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]