Page 1 sur 1

Comportement étrange d'une variable de session

Posté : 18 févr. 2009, 15:25
par Smartie'S
Bonjour, je viens de mettre en ligne un formulaire de contact réalisé en PHP sur mon site perso.

J'ai effectué tous les tests préalables offline et tout fonctionnait parfaitement.

La version online se comporte quant à elle étrangement : l'envoie du mail fonctionne quel que soit le captcha renseigné, qu'il soit bon ou mauvais.

Avec des conditions telles que je les ai codées, ça ne devrait pas être possible.

Mon formulaire :
* en début de page session_start();

		<form method="post" action="" >
			<fieldset>
				<legend>Formulaire de contact</legend>
				
				<div id="main">
<?php

if ((isset($_POST['mail'])) &&
    (isset($_POST['subject'])) &&
    (isset($_POST['body'])) &&
    (isset($_POST['captcha'])) &&
    (isset($_SESSION['captcha'])))
{
	$mail = htmlentities($_POST['mail'], ENT_QUOTES);
	$subject = htmlentities($_POST['subject'], ENT_QUOTES);
	$body = nl2br(htmlentities($_POST['body'], ENT_QUOTES));		
	$captcha = htmlentities($_POST['captcha'], ENT_QUOTES);
	
	if ((!empty($_POST['mail'])) &&
	    (!empty($_POST['subject'])) &&
	    (!empty($_POST['body'])) &&
	    (!empty($_POST['captcha'])) &&
	    (!empty($_SESSION['captcha'])))
	{
		if ($captcha == $_SESSION['captcha'])
		{
			if (preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!", $mail))
			{
				$to     = '[email protected]';
				$header = "From: $mail \n";
				$header .= "X-Priority: 1 \n";
				$header .= "Content-Type: text/html \n";
	
				if (mail( $to , $subject , $body, $header ))
				{
					echo '<p class="warning-right"><strong>Votre message à été envoyé !</strong></p>';
				}
				else {			
					echo '<p class="warning-wrong"><strong>Une erreur est survenue, merci de réessayer plus tard.</strong></p';
				}
			}
			else {
				echo '<p class="warning-wrong"><strong>L\'adresse e-mail que vous avez entrée n\'est pas valide.</strong></p>';
			}
		}
		else {
			echo '<p class="warning-wrong"><strong>Le captcha n\'est pas bon.</strong></p>';
			
			session_destroy();
		}
	}
	else {
		echo '<p class="warning-wrong"><strong>Tous les champs ne sont pas remplis.</strong></p>';
	}
}

?>				
					<p><label for="mail">Votre e-mail :</label><input type="text" name="mail" id="mail" value="<?php echo $mail; ?>" /></p>
					<p><label for="subject">Sujet :</label><input type="text" name="subject" id="subject" value="<?php echo $subject; ?>" /></p>
					<p><label for="body">Texte :</label><textarea id="body" name="body"><?php echo $body; ?></textarea></p>
				</div>
				
				<fieldset>
					<legend>Captcha anti-spam</legend>
					
					<p>
						Vous devez recopier les chiffres que vous voyez dans l'image ci-dessous.<br/>
						Cette image ne contient que des chiffres, il n'y a pas de lettre.
					</p>

					<p style="margin: 10px;"><img src="../includes/captcha.php" alt="Captcha" /></p>
					
					<p><label for="captcha">Cpatcha :</label><input type="text" name="captcha" id="captcha" /></p>
				</fieldset>		 
				
				<p><input type="submit" value="Envoyer" id="submit" /></p>		
			</fieldset>
		</form>
Mon captcha :
<?php
session_start();

function nombre($n)
{
        return str_pad(mt_rand(0,pow(10,$n)-1),$n,'0',STR_PAD_LEFT);
}

function image($mot)
{
$largeur = strlen($mot) * 10;
        $hauteur = 20;
        $img = imagecreate($largeur, $hauteur);
        $blanc = imagecolorallocate($img, 255, 255, 255); 
        $noir = imagecolorallocate($img, 0, 0, 0);
        $milieuHauteur = ($hauteur / 2) - 8;
        
        imagestring($img, 6, strlen($mot) /2 , $milieuHauteur, $mot, $noir);
            
        imageline($img, 2, $milieuHauteur + 8, $largeur - 2, $milieuHauteur + 8, $noir);
        imageline($img, 2,mt_rand(2,$hauteur), $largeur - 2, mt_rand(2,$hauteur), $noir);
            
        imagepng($img);
        imagedestroy($img);
}

function captcha()
{
        $mot = nombre(5);
        $_SESSION['captcha'] = $mot;
        
        image($mot);
}

header("Content-type: image/png");
captcha();
?>
Auriez-vous une idée concernant l'origine de ce problème ?

Merci d'avance.

Posté : 19 févr. 2009, 00:54
par rolusseum
Affiche les variables en session de tes pages.
echo '<pre>';
print_r($_SESSION);
echo '</pre>';

Posté : 19 févr. 2009, 15:35
par Smartie'S
Bonjour et merci pour ta réponse.

C'est réglé :-)

Il s'agissait d'un problème de register_globals.

J'ai solutionné le problème en renommant les variables .
J'en ai profité pour faire un tour du côté de la configuration de PHP sur mon mutualisé OVH, et y faire quelques changements (via un .htaccess dans /www/):

SetEnv REGISTER_GLOBALS 0
SetEnv MAGIC_QUOTES 0
SetEnv PHP_VER 5

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 19 févr. 2009, 15:37
par mere-teresa
Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)