8791 sujets

Développement web côté serveur, CMS

bonjour,

ma question est simple, je sais qu'il faut vérifier tout les champs d'un formulaire du coté serveur pour éviter d'avoir des problème, mais est ce valable que pour les champs text, textarea et autre saisie de l'utilisateur ou aussi pour les checkbox et les radio qui sont plus ou moins déjà imposé par le script?

ce que je veux dire par la c'est que si mon script d'exploitation des résultat du formulaire n'attend que les 2 ou 3 valeur prévu par le checkbox, l'utilisateur mal intentionné aura beau essayer a envoyer une requête autre ça ne devrais rien faire.

je me trompe?
Modifié par joe-dalton (14 Mar 2010 - 18:46)
Hello et Bienvenue,

joe-dalton a écrit :
je me trompe?
Oui et non. D'une manière générale il faut prévoir que tous les champs peuvent contenir n'importe quoi et que tous les attributs value peuvent être modifiés (et envoyée en POST grâce à CURL).

Un exemple pour s'en prémunir :
<?php
// Liste des loisirs (checkbox)
$loisirs = array(
	'equitation'	=>	'équitation',
	'echecs'		=>	'échecs',
	'lecture'		=>	'lecture'
);

// Liste des ages (radio)
$ages = array(
	'0'	=>	'- de 18 ans',
	'1'	=>	'de 18 à 35 ans',
	'2'	=>	'+ de 35 ans'
);

// Initialisation ou récupération des variables
$age = !empty($_POST['age']) && array_key_exists($_POST['age'], $ages) ? intval($_POST['age']) : 0;

$erreurs = array();

if($_SERVER['REQUEST_METHOD']=='POST') {
	// au moins 1 loisir
	if(empty($_POST['loisirs'])) {
		$erreurs[] = 'Vous devez sélectionner au moins un loisir.';
	}

	// Aucune erreur...
	if(empty($erreurs)) {
		echo '<p>Loisir(s) sélectionné(s) :</p>';
		foreach($_POST['loisirs'] as $loisir) {
			if(array_key_exists($loisir, $loisirs)) echo '<p>* '.$loisirs[$loisir].'</p>';
		}
		echo '<p>Age : '.$ages[$age].'</p>';
		// Traitement (envoi de mail, Insert en base, etc.)
		// header('Location: confirmation.php'); // Redirection vers la page de confirmation
	}
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
<style type="text/css" media="screen">
.alerte {
	color: #FF0033;
	font-weight: bold;
}
</style>
</head>
<body>
<?php
if(!empty($erreurs)) {
	foreach($erreurs as $erreur) {
		echo '<p class="alerte">'.$erreur."</p>\n";
	}
}
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
	<p>Loisirs :<br />
<?php
	foreach($loisirs as $value	=>	$libelle) {
		$checked = !empty($_POST['loisirs']) && in_array($value, $_POST['loisirs']) ? ' checked="checked"' : '';
		echo "\t\t".'<input type="checkbox" name="loisirs[]" value="'.$value.'" id="'.$value.'"'.$checked.' />'."\n";
		echo "\t\t".'<label for="'.$value.'">'.$libelle.' :</label><br />'."\n";
	}
?>
	</p>
	<p>Age :<br />
<?php
	foreach($ages as $value	=>	$libelle) {
		$checked = $age == $value ? ' checked="checked"' : '';
		echo "\t\t".'<input type="radio" name="age" id="age_'.$value.'" value="'.$value.'"'.$checked.' />'."\n";
		echo "\t\t".'<label for="age_'.$value.'">'.$libelle.'</label><br />'."\n";
	}
?>
	</p>
	<p>
		<input type="submit" />
	</p>
</form>
</body>
</html>
tout d'abord merci pour la réponse, mais j'ai besoin de quelque confirmation:

    if(empty($erreurs)) { 
        echo '<p>Loisir(s) sélectionné(s) :</p>'; 
        foreach($_POST['loisirs'] as $loisir) { 
            if(array_key_exists($loisir, $loisirs)) echo '<p>* '.$loisirs[$loisir].'</p>'; 
        } 
 



si je comprend bien cette partie du code, tu vérifie pour chaque loisir qu'il existe dans le choix possible c'est bien ça? donc si quelqu'un envoi autre chose que ce qui est attendu par la liste de loisirs, le script shootera cette réponse car non valide.


par contre pour l'age....


        echo '<p>Age : '.$ages[$age].'</p>'; 


je vois pas a quel moment on vérifie que la réponse est valide? c'est juste le fait que la réponse se situe dans le tableau des choix possibles? que se passerai il si la réponse été pas contenu dans le choix?


et enfin juste par curiosité, pourquoi un htmlspecialchars() sur $_SERVER['PHP_SELF'] ?


<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post"> 



je ne connais pas curl, après une petite recherche je viens de trouvé quelque info dessus. je vais prendre le temps de lire tout ça.... Smiley sweatdrop ce qui est bien avec tout ça, c'est qu'on a toujours quelque chose de nouveau a voir et apprendre., mais les journées sont trop courtes Smiley confus

merci a+ Smiley jap
Modifié par joe-dalton (14 Mar 2010 - 09:39)
joe-dalton a écrit :
si je comprend bien cette partie du code, tu vérifie pour chaque loisir qu'il existe dans le choix possible c'est bien ça?
Oui.

joe-dalton a écrit :
par contre pour l'age [...] je vois pas a quel moment on vérifie que la réponse est valide? c'est juste le fait que la réponse se situe dans le tableau des choix possibles? que se passerai il si la réponse été pas contenu dans le choix?
C'est la ligne
$age = !empty($_POST['age']) && array_key_exists($_POST['age'], $ages) ? intval($_POST['age']) : 0; 
Si la valeur est différente de 0, 1 ou 2 on prend 0 par défaut.

joe-dalton a écrit :
et enfin juste par curiosité, pourquoi un htmlspecialchars() sur $_SERVER['PHP_SELF'] ?
Parce que cette variable peut-être modifiée par un utilisateur. Voir par exemple cet article (en anglais).

joe-dalton a écrit :
ce qui est bien avec tout ça, c'est qu'on a toujours quelque chose de nouveau a voir et apprendre., mais les journées sont trop courtes
Oui mais il y en a tout plein ! Smiley langue
merci beaucoup Smiley jap


Heyoan a écrit :


Parce que cette variable peut-être modifiée par un utilisateur. Voir par exemple cet article (en anglais).



encore un truc a apprendre l'anglais Smiley rolleyes
enfin je comprend la plupart des trucs mais me faut du temps Smiley sweatdrop