Provenance de variables formulaire

Eléphant du PHP | 185 Messages

12 oct. 2006, 17:33

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 ?
Modifié en dernier par Kaoteknik le 13 oct. 2006, 11:50, modifié 1 fois.

ant
Eléphant du PHP | 161 Messages

12 oct. 2006, 17:44

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. :?

Eléphant du PHP | 185 Messages

12 oct. 2006, 18:03

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 ?

ant
Eléphant du PHP | 161 Messages

12 oct. 2006, 18:21

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

Administrateur PHPfrance
Administrateur PHPfrance | 449 Messages

12 oct. 2006, 18:31

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.
Cordialement
Saeveas

http://saeveas.labrute.fr

Eléphant du PHP | 185 Messages

12 oct. 2006, 19:02

Très bien, je vais orienter mes recherches dans ce sens. Merci à vous pour vos conseils. :)

Eléphant du PHP | 185 Messages

13 oct. 2006, 11:27

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 ?

ant
Eléphant du PHP | 161 Messages

13 oct. 2006, 12:36

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.

Administrateur PHPfrance
Administrateur PHPfrance | 449 Messages

13 oct. 2006, 13:06

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 ^^)
Cordialement
Saeveas

http://saeveas.labrute.fr

Eléphant du PHP | 63 Messages

15 oct. 2006, 00:11

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
Ce forum est devenu invivable... Des gens qui se croient plus intelligents que les autres et qui, au lieu d'aider, se prennent pour Dieu... A quelques exceptions...