Page 1 sur 1

Provenance de variables formulaire

Posté : 12 oct. 2006, 17:33
par Kaoteknik
Bonjour,

j'ai écrit un petit code classique de formulaire destiné à permettre aux utilisateurs de m'envoyer un mail. J'ai nommé ce fichier "formulaire.html".

Jusque là tout va bien...

Un second fichier nommé "traitement.php" va, comme son nom l'indique, traiter les données entrées dans le formulaire et me les transmettre par mail.

Toujours pas de problème, mon script fonctionne très bien.

Néanmoins il me semble qu'il y ait une faille de sécurité, laquelle j'aimerai résoudre, sans trop savoir comment. En effet, qu'est-ce qui pourrait empêcher un individu mal intentionné d'écrire un script utilisant mon fichier "traitement.php" en y incluant une boucle afin de spammer ma boîte ?

Je me demandais donc si il était possible de contrôler la provenance des variables, et le cas échéant les bloquer si elle ne proviennent pas du formulaire que j'ai mis en place ?

Posté : 12 oct. 2006, 17:44
par ant
j'ai pas compris ta première question mais pour celle-ci:
Je me demandais donc si il était possible de contrôler la provenance des variables, et le cas échéant les bloquer si elle ne proviennent pas du formulaire que j'ai mis en place ?
Les variables que tu traites dans "traitement.php" sont des variables qui passent par POST ou par GET à partir de ton formulaire.

En consultant le tableau approprié ($_POST ou $_GET ou $_REQUEST qui englobe les 2) tu peux donc connaitre les variables qui sont passées à partir du formulaire et les traiter comme tu le souhaites.

Voila, Je vois pas quoi te répondre de plus. :?

Posté : 12 oct. 2006, 18:03
par Kaoteknik
Merci d'avoir répondu, même si je n'ai pas compris ce que je devais faire. Je vais donc essayer d'être plus clair dans mes explications, et peut-être qu'en déposant le script ici nous parviendrons à y voir plus clair ! :)

Voici donc le formulaire (je l'ai épuré de sa mise en forme pour plus de lisibilité), qui s'intitule "formulaire.html" :

Code : Tout sélectionner

<form action="traitement.php" method="post"> Nom : <input type="text" name="nom" /><br /> Pr&eacute;nom : <input type="text" name="prenom" /><br /> Adresse email : <input type="text" name="adresse" /><br /> Message : <br /> <textarea name="message" rows="4" cols="40"></textarea><br /> <input type="submit" name="valider" value="valider" /> </form>
Puis le script "traitement.php" :
$nom=$_POST['nom'];
$prenom=$_POST['prenom'];
$adresse=$_POST['adresse'];
$message=$_POST['message'];

$mailto="[email protected]";

$envoi=true;

if ($nom=="" || $prenom=="" || $adresse=="" || $message==""){
$envoi=false;}
else {
$contenu_mail .= "Nom : $nom\nPrénom : $prenom\nAdresse email : $adresse\nMessage : $message\n";}

if ($envoi == true) {
mail($mailto, $nom, $contenu_mail, "From: [email protected]");
echo "Votre message a bien été envoyé. Merci.\n";
echo "<a href=\"index.html\">Retour</a>";
}
else {
echo "Veuillez remplir tous les champs du formulaire.";} 

Voilà, tout ceci fonctionne très bien, malheureusement je pense qu'une personne s'y connaissant un peu pourrait écrire un script php qui contiendrait une boucle (de type "for" ou autre), qui validerait l'envoi du formulaire en continu...

Le but serait donc de vérifier que les variables transmises au script "traitement.php" viennent bien du fichier "formulaire.php", et non pas d'un fichier qu'un petit malin aurait lui-même écrit.

Est-ce possible ?

Posté : 12 oct. 2006, 18:21
par ant
En effet, qu'est-ce qui pourrait empêcher un individu mal intentionné d'écrire un script utilisant mon fichier "traitement.php" en y incluant une boucle afin de spammer ma boîte ?
En l'état rien :D

Il faut soit utiliser:

- un "patcha" en validation du form ou il faut recopier des lettres/chiffres générés aléatoirement dans une image. (technique employée un peu partout maintenant...)

- soit par ex, utiliser les sessions avec un timer qui expire au bout de x minutes

etc

Posté : 12 oct. 2006, 18:31
par SAEVEAS
Oui c'est possible, il existe des variables d'environnement et des variables serveur que tu peux interoger pour cela.

fait pointer ton formulaire vers un script contenant
phpinfo();
tu trouveras une variable que tu pourras tester $_SERVER["HTTP_REFERER"]
pour voir d'ou viennent les variables transmises.

Posté : 12 oct. 2006, 19:02
par Kaoteknik
Très bien, je vais orienter mes recherches dans ce sens. Merci à vous pour vos conseils. :)

Posté : 13 oct. 2006, 11:27
par Kaoteknik
Formidable, ça fonctionne ! :)

Voici le code pour effectuer ce contrôle, pour ceux et celles que ça intéresserait :
if ($_SERVER['HTTP_REFERER']=="url du formulaire de mon site"){
$nom=$_POST['nom'];
$prenom=$_POST['prenom'];
$adresse=$_POST['adresse'];
$message=$_POST['message'];

$mailto="[email protected]";

$envoi=true;

if ($nom=="" || $prenom=="" || $adresse=="" || $message==""){
$envoi=false;}
else {
$contenu_mail .= "Nom : $nom\nPrénom : $prenom\nAdresse email : $adresse\nMessage : $message\n";}

if ($envoi == true) {
mail($mailto, $nom, $contenu_mail, "From: [email protected]");
echo "Votre message a bien été envoyé. Merci.\n";
echo "<a href=\"index.html\">Retour</a>";
}
else {
echo "Veuillez remplir tous les champs du formulaire.";}
}
else {
echo "L'email que vous tentez d'envoyer ne provient pas du formulaire du site.<br />
Veuillez réessayer à partir de ce lien : <a href=\"url du formulaire de mon site\">Contact</a>";
}
Voilà, en espérant que ça pourra en aider d'autres que moi. ;)

Encore merci de m'avoir mis sur la bonne voie. Il ne me reste plus qu'à effectuer des contrôles sur la nature des informations saisies dans les champs du formulaire. Ca passe par le javascript si je ne dis pas de bêtises, non ?

Posté : 13 oct. 2006, 12:36
par ant
Ce que te dit SAEVEAS, c'est trés bien mais, certainement pas une protection ultime et loin de là.

Je me répète mais, en l'état, rien n'empèche un robot de scanner la page de ton formulaire, de le remplir 100000 fois et, de te spammer.

La seule protection efficace relativement simple à mettre en place c'est un captcha : http://fr.wikipedia.org/wiki/Captcha
Tu en as des tout fait comme ici: http://www.cryptographp.com/index.php?page=1
(pas besoin de réinvter la roue surtout que ca fait appel à des algorithmes relativement complexes).
Pour le contrôle de tes données côté client, ca peut passer par javascript pour effectuer une vérification au niveau de la saisie des données dans le formulaire.

Mais ca doit aussi passer par une vérification obligatoire côté serveur donc par php.

Posté : 13 oct. 2006, 13:06
par SAEVEAS
Ce que te dit SAEVEAS, c'est trés bien mais, certainement pas une protection ultime et loin de là.
On est bien d'accord que cela n'a rien d'ultime comme protection, d'ailleurs "protection ultime" en informatique cela n'existe pas ( a part chez Microsoft ^^)

Posté : 15 oct. 2006, 00:11
par zeuf
Salut à tous !

Voici un complément d'information sur la variable HTTP_REFERER (issu du Manuel officiel du PHP 5) :
'HTTP_REFERER'
L'adresse de la page (si elle existe) qui a conduit le client à la page courante. Cette valeur est affectée par le client, et tous les clients ne le font pas. Certains navigateurs permettent même de modifier la valeur de HTTP_REFERER, sous forme de fonctionnalité. En bref, ce n'est pas une valeur de confiance.

Il n'y a pas UNE façon de procéder (surtout en sécurité !) mais plusieurs, qu'il faut cumuler :

- le REFERER,

- le Captchat,

- Contrôler le contenu des variables (échapper le contenu des variables à l'aide des outils appropriés : addslashes, htmlspecialchars,... - Mais aussi leur valeur avec les expressions rationnelles ex. : le signe egal (=) n'aurait rien à faire dans la variable prénom,...),

- Contrôler aussi la longueur du contenu des variables (un prénom qui fait 350 caractères, c'est louche),

- Mettre une valeur en SESSION (sur ta page 1 tu mets en session la valeur FORMULAIRE_OK par exemple et dans ta page 2 tu vérifies que ta session contient bien cette valeur),

Et je pense que j'en oublie mais ce sera déjà suffisant !

Bon codage !

Zeuf