Aller au contenu

formulaire sécurisé ou pas?


pixette

Sujets conseillés

Bonjour,

Je suis novice en php mais j'ai eu besoin d'installer un formulaire pour une inscription toute simple à une newsletter.

Je voudrais savoir si ce code vous parait sécurisé, j'ai cru comprendre qu'il faut utiliser htmlentities, supprimer les guillemets et faire attention à session_start() mais je ne comprends pas comment... mais peut-être n'est-ce pas nécessaire sur ce script?

Merci de vos conseils

Voici la page de traitement du formulaire

<?php
/* nous démarrons la session afin de récupérer la valeur codée */
session_start();
/* Nous testons que la variable existe et qu'elle a bien la longueur souhaitée */
if(!isset($_SESSION['code']) OR strlen($_SESSION['code']) !=5) exit("Erreur !");

/* Comparaison entre les deux valeurs si elles sont différentes on arrete tout sinon on continue et on envoie le mail */
if($_SESSION['code'] != $_POST['verif']) exit("Erreur les valeurs sont différentes !");

/* on récupère le mail de la personne qui envoi le mail si elle la saisi on peut envisager de vérifier que ce champ est rempli avec une adresse valide mais ce n'est pas le but ici */
$exp = htmlentities($_POST['mail']);
/*on formate les chaine d'objet et de corps du mail */
$objet = stripslashes($_POST['objet']);
$action = stripslashes($_POST['action']);
/* envoi du mail a proprement parlé */
$envoi= mail("moi_AT_site.fr", $action,"Action: $action\r\n"."From: $exp\r\n"."Reply-To: $exp\r\n");
if($envoi) echo"Votre demande a bien été prise en compte !";
else echo"Erreur";
/* on efface et détruit les varaibles de sessions */
session_unset();
session_destroy();
?>

Et ça c'est un code qui génère une image à recopier par l'utilisateur:

<?php
/* Démarage d'une session nécéssaire pour récupérer la valeur générée d'une page a l'autre */
session_start();
/* on définie la liste qui va servir a récupérer les lettres qui formeront la valeur a saisir : on exclue le 0 (zéro) pour eviter la confusion avec le O */
$liste = "abcdefghijklmnopqrstuvwxyz123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/* On créer une valeur qui sera notre code secret a saisir */
$code = '';
/* On crée une boucle pour créer une chaine de 5 caractères pris au hasard au sein de la variable $liste */
while(strlen($code) != 5) {
$code .= $liste[rand(0,63)];
}
/* on définit une variable de session nomée $_SESSION['code'] que l'on réutilisera plus tard */
$_SESSION['code']=$code;
/* on crée une image de 50 pixels par 20 pixels */
$larg = 50;
$haut =20;
$img = imageCreate($larg, $haut);
$rouge = imageColorAllocate($img,255,0,0);
$noir = imageColorAllocate($img,0,0,0);
$code_police=5;
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header("Content-type: image/jpeg");
/* incorporation de la variable variable $code dans l'image */
imageString($img, $code_police,($larg-imageFontWidth($code_police)*strlen("".$code.""))/2,0, $code,$noir);
/* on crée une image de relative mauvaise qualité (ici 23% d'une image normale pour eviter la reconnaissance visuelle de certains robots */
imagejpeg($img,'',50);
imageDestroy($img);
?>

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

pour sécuriser un formulaire, il faut se poser la question suivante : que pourrait mettre un malfaisant dans une variable de type POST ou GET qui pourrait poser problème.

Par exemple, la "faille" la plus connue de php est l'utilisation d'une variable pour faire un include, de type

include($_GET['moninclude']);

. Il suffit dans ce cas à un pirate de mettre le fichier qu'il lui plaira d'inclure dans la valeur de la variable.

Dans le cas de ton code, le seul risque que je verrais serai qu'on t'envoie des headers supplémentaires, et c'est là dessus que tu pourrais améliorer le code.

Je te met un lien sur le premier article que j'ai trouvé sur le sujet ( en anglais ) : Email header injection

Lien vers le commentaire
Partager sur d’autres sites

Une question, pourquoi s'embêter à générer une image et ennuyer le visiteur à comprendre ce qu'il y a écrit pour le recopier alors que tu peux mettre ta clés dans un champ invisible (type Hidden) et vérifier à la réception que ta variable SESSION est bien identique au champ hidden ?

Lien vers le commentaire
Partager sur d’autres sites

Le champ "hidden" étant en "html" il peut être "lu" par un robot et ensuite envoyé en même temps que le formulaire, donc c'est pas sécurisé du tout ! Il suffit au hacker de regarder le code source de la page pour s'en affranchir.

Concernant la faille de l'include, merci de nous faire un rappel mais sauf erreur cela ne concerne pas le script de pixette.

Pour sécuriser un formulaire, il faut au minimum mettre un htmlspecialchars() ou htmlentities() à toutes les variables récupérées, qu'elles viennent d'un menu déroulant, d'une case à cocher ou d'un champ texte. Bien sur il peut être nécessaire de remettre en forme le contenu des variables (hacké n'est pas très joli), une expression régulière pouvant très bien le faire ou un str_replace() et un stripslashes() pour faire plus simple.

Par exemple, la première chose à faire sur une variable

$toto=stripslashes(htmlspecialchars($_POST['toto']));

avant tout autre traitement.

++

Patrick

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...