$_POST vide.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : $_POST vide.

Re: $_POST vide.

par Cobaye » 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.

Re: $_POST vide.

par paro » 02 nov. 2009, 11:41

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

Re: $_POST vide.

par draghysck » 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...

Re: $_POST vide.

par FuZZyLine » 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 ;)

@+ ;)

Re: $_POST vide.

par AB » 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/>';

Re: $_POST vide.

par FuZZyLine » 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 ;)

Re: $_POST vide.

par paro » 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...

Re: $_POST vide.

par Yosh » 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.

Re: $_POST vide.

par paro » 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?

Re: $_POST vide.

par FuZZyLine » 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

@+ ;)

Re: $_POST vide.

par paro » 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?

Re: $_POST vide.

par FuZZyLine » 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

@+ ;)

Re: $_POST vide.

par paro » 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.

Re: $_POST vide.

par paro » 31 août 2009, 14:49

"register_globals = Off"

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

Edit: aucune différence.

Re: $_POST vide.

par Victor BRITO » 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