Probleme simple de formulaire securisé pour un expert

Eléphant du PHP | 299 Messages

26 août 2007, 01:58

Bonjour a tous,

je me suis inscrit a la demande d un ami qui m' a dit pouvoir trouver de l' aide efficace ici.

J' ai un formulaire simple:

Code : Tout sélectionner

<form method=POST action=formmailbis.php > <input type=hidden name=subject value=formmail> <table width="318"> <tr> <td width="97"><div align="right"><span class="Style6">Votre Nom:</span></div></td> <td width="25">&nbsp;</td> <td width="180" height="30"><div align="left"> <input name=realname type=text size=30> </div></td> </tr> <tr> <td><div align="right"><span class="Style6">Votre Email:</span></div></td> <td>&nbsp;</td> <td height="30"><div align="left"> <input name=email type=text size=30> </div></td> </tr> <tr> <td><div align="right"><span class="Style6">Sujet:</span></div></td> <td>&nbsp;</td> <td height="30"><div align="left"> <input name=title type=text size=30> </div></td> </tr> <tr><td colspan=3><span class="Style2"><span class="Style6"><br /> Commentaires:</span><br> <textarea COLS=50 ROWS=6 name=comments></textarea> </span></td> </tr> </table> <br> <input type=submit value=Envoyer> <span class="Style9">- </span> <input type=reset value=Annuler> </form>
celui ci une fois cliqué sur le bouton envoyé va a la page formmailbis.php qui indique qu' il doit envoyer le mail.

Code : Tout sélectionner

<?php $TO = "[email protected]"; $h = "From: " . $TO; $message = ""; while (list($key, $val) = each($HTTP_POST_VARS)) { $message .= "$key : $val\n"; } mail($TO, $subject, $message, $h); Header("Location: http://www.monsite.fr/"); ?>
Il fonctionne tres bien malgré sa simplicité. Seulement le hic est que je suis spammé a mort mais j' ai pourtant besoin de ce formulaire pour mes clients. Je suis graphiste. J' ai essayé de rajouter du javascript pour la verification des champs et ca marche plutot bien, mais meme un robot peut passer cette epreuve. J' ai donc pense a un captcha comme cryptographp.com. le cryptogramme s' affiche bien mais j' ai beau placer le code de diverses facon, sur la premiere page ou sur l' autre, le mail est tout de meme envoyé, et pourtant le captcha fonctionne car si le code est faux, il le dit, pareil si il est bon. Que me conseillez vous. Au moins quatre mois que je teste diverses infos que j' ai trouvé sur le net, je ne trouve pas vraiment mon bonheur, autrement dit un formulaire de contact ou je ne suis pas spammé.

Merci a tous :s

ViPHP
ViPHP | 1380 Messages

26 août 2007, 11:30

Bonjour et bienvenue.

Tout d'abord, il faudrait soigner un peu les attributs de tes balises html. Tu as oublié de les encadrer de guillemets. C'est un détail sauf si tu veux écrire de l'html normalisé.

Pour ton problème, je ne vois rien dans ta page cible qui vérifie ton captcha. De plus, attention à la manière dont tu récupères les variables POST. Tu t'exposes à beaucoup d'ennuis à procéder de la sorte. Tu devrais valider chaque variable POST individuellement.

Pour vérifier ton captcha le plus simple est travailler avec les sessions PHP. En gros:

formulaire:
<?php
session_start();
// où $catpcha est le contenu de l'image générée par ton code captcha
$_SESSION['captcha'] = $captcha;
?>
<form etc....   >
  <input ..... />
  <input .... />
  <label for="captcha">Tapez ici le code captcha</label>
  <input id="captcha" name="captcha" type="text" />
  ... etc ...
</form>
page cible
<?php
session_start();

// ICI vérifications des variables POST individuellement
 .....

// vérif captcha
if ($_SESSION['captcha'] == $captcha;){
  // on continue
} else {
  // on l'envoie se balader
}
ripat

Eléphant du PHP | 299 Messages

26 août 2007, 18:04

Heu j' ai du mal a comprendre je vais essayer de faire comme tu as dit mais je ne pense pas y arriver sincerement. Peu etre as tu msn pour que je puisse te contacter? merci d' avance

ViPHP
ViPHP | 1380 Messages

26 août 2007, 21:00

Pour que tu profites bien de la discussion il faudrait faire le point de tes connaissances en PHP et faire une bonne lecture de quelques tuto de base sur les sessions. Pas très compliqué.

Revois également les structures de langage comme les tests logiques (if - else) et le fonctionnement des variables en PHP. Ce ne sera jamais du temps perdu. Même comme graphiste tu seras un jour ou l'autre confronté à un langage de script (PHP, ASP, PERL, JAVA etc...)

La solution PHP à ton problème est à ta portée. Tu peux te contenter d'inclure un script de captcha sans vraiment comprendre ce qu'il fait mais, par contre, il est indispensable que tu aies quelques bases pour le traitement en aval.
ripat

Eléphant du PHP | 299 Messages

05 sept. 2007, 23:14

Bon ben, j' avoue que je comprend un script quand je l' ai sous les yeux, mais je crois n' avoir aucune logique php.


Ca fait plus de 3 ans que j' essaie de l' utiliser sans grand succés.


Tant pis merci quand meme.

ViPHP
ViPHP | 1380 Messages

06 sept. 2007, 10:39

Faut pas baisser les bras comme ça!

Tu as besoin de faire deux pages comme indiqué plus haut. La page de ton formulaire qui comprendra le code qui génère le captcha et une page de récupération des valeurs des champs du formulaire. Cette deuxième page validera les champs de la première ET vérifiera si le code captcha envoyé par l'utilisateur correspond bien au code généré par la page 1. Exemple schématique:

PAGE 1
// activation de sessions
session_start();

// code captcha (avec gd ou autre)
  // composé généralement d'une génération de chaine aléatoire
  $codeCaptcha = fonctionChaineAleatoire();

  // et d'une génération de l'image
  $imgCaptcha = fonctionGenerationImage($codeCaptcha);

// stocakge du code captcha en session
$_SESSION['captcha'] = $codeCaptcha

// ton formulaire
  // <form action= ....>
  //  ...
  // </form>
PAGE 2
// activation de sessions
session_start();

// validation classique des champs de ton formulaire
  // if isset() and not empty() etc...
  // else retour formulaire

// vérification du captcha
if ($_POST['captcha'] == $_SESSION['captcha']) {
  // code pour OK
} else {
  // code pour KO, par exemple un header('location .....) pour un retour au formulaire
}
Essaye sur un formulaire simple et reviens vers nous si tu as des problèmes.
ripat

Eléphant du PHP | 299 Messages

07 sept. 2007, 00:04

Ca ne fonctionne pas, je l' avais bien dit, je suis une quequette dans ce domaine :roll:

En fait je viens de voir que je n' avais pas rajouté le script de captcha dans mon exemple tout en haut de page :/ Personne pour me faire ca ? Je sais bien que c' est la facilité mais bon. Deja je me demande si le formmail est un bon systeme de formulaire mail car j' en ai vu plusieurs types, mais bon celui la fonctionne bien malgré le grand nombre de spamm :(

ViPHP
ViPHP | 2144 Messages

07 sept. 2007, 01:44

Les membres du forum, sont là pour t'aider et te donner des conseils.
Mais il faut que tu nous dises ce qui ne fonctionne pas, faut pas avoir peur de donner des détails, c'est grace à ça, qu'on pourra cerner où est le problème.

Ripat t'a donné une marche à suivre assez précise, qu'a-t-elle donné comme résultats/erreurs ?

ViPHP
ViPHP | 1380 Messages

07 sept. 2007, 08:56

En fait je viens de voir que je n' avais pas rajouté le script de captcha dans mon exemple tout en haut de page :/ Personne pour me faire ca ? Je sais bien que c' est la facilité mais bon. Deja je me demande si le formmail est un bon systeme de formulaire mail car j' en ai vu plusieurs types, mais bon celui la fonctionne bien malgré le grand nombre de spamm :(
Il y en a des tonnes sur le net, celui-ci ne me semble pas trop usine à gaz:
http://www.white-hat-web-design.co.uk/a ... aptcha.php

Voici un mini-script pour ce que tu veux faire. Il te suffira de l'adapter. Mais je te recommande chaudement de te mettre une bonne fois au PHP (et à l'htlml conforme) pour vraiment profiter des conseils de ce forum. Il existe de bons tutos de base. Tu peux aussi procéder par essais-erreurs et poster tes questions dans le salon Débuter en PHP.
  • Créer une page captcha.php
    Qui contiendra la classe du lien donné plus haut. Tel quel.
  • Page formulaire - captcha_form.php
    <?php
    // activation des sessions pour récup des msg d'erreur éventuels
    session_start();
    
    // récup msg erreur
    if ( isset($_SESSION['err']) ){
        echo '<p style="color: red;">'.$_SESSION['err'].'<p>';
        unset ($_SESSION['err']);
    }
    ?>
    
    <!-- ici on appelle le script captcha.php qui va fabriquer une image -->
    <img src="captcha.php">
    
    <!-- ton formulaire -->
    <form action="captcha_valid.php" method="post">
        <p>
            <label for="captcha">Security Code:</label>
            <input id="captcha" name="captcha" type="text" />
    
            <label for="email">Introduisez email:</label>
            <input id="email" name="email" type="text" />
    
            <input type="submit" value="Envoyer" />
        </p>
    </form>
    
  • page de validation - captcha_valid.php
    <?php
    //activation des sessions pour récupérer le security_code du générateur de captcha
    session_start();
    
    // récupération des champs du formulaire
    if( !empty($_POST['captcha']) && !empty($_POST['email']) ){
        $captcha = $_POST['captcha'];
        $email   = $_POST['email'];
    } else {
        // retour formulaire avec msg d'erreur
        $_SESSION['err'] = "Veuillez remplir tous les champs";
        header('Location: captcha_form.php');
        exit;
    }
    
    // vérification du captcha et éjection si pas correct
    if ( $captcha != $_SESSION['security_code']  ){
        $_SESSION['err'] = "Le code captcha ne correspond pas. Veuillez recommencer SVP.";
        header('Location: captcha_form.php');
        exit;
    } else {
        // raz du code captcha
        unset($_SESSION['security_code']);
    
        echo "C'est tout bon! le captcha ".$captcha." a été correctement introduit!";
    
        // suite de ton code pour le traitement de ton formulaire....
    }
    
    
ripat

Eléphant du PHP | 299 Messages

09 sept. 2007, 23:44

Merci d' être aussi sympatique et patient.

Malheuresement je part dans 2h pour le boult et rentrerai vendredi soir seulement a je ne sais pas quelle heure. Je vous tiend au courant :cry:

Eléphant du PHP | 299 Messages

23 sept. 2007, 02:38

Alors voila je vais etre honnete, je n' ai pas eu le temps, etant routier, je suis debordé, mais l' entreprise de mon pere a besoin de ce formulaire sans etre spammé. Quelqu' un pourrai t il m' envoyer ces deux ou trois pages de formulaires que j' integrerai a son site?

Si vous etes ok, voici mon mail :cry: [email protected]


Mille mercis d' avance a mon eventuel futur sauveur :wink:

Petit nouveau ! | 2 Messages

19 févr. 2008, 21:03

Allo Ripat,

Qu'est-ce que tu rajoutera dans ton code pour pouvoir anvoyer les résultats du formulaire par courriel?

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

ViPHP
ViPHP | 1380 Messages

19 févr. 2008, 21:26

Une fois ton formulaire validé (captcha et variables POST) tu peux en faire ce que tu veux. L'afficher dans une page, le stocker en bdd, fichier plat ou te l'envoyer par email.

Pour ce dernier point, regarde du côté de la fonction mail()
ripat

Petit nouveau ! | 2 Messages

19 févr. 2008, 22:26

Une fois ton formulaire validé (captcha et variables POST) tu peux en faire ce que tu veux. L'afficher dans une page, le stocker en bdd, fichier plat ou te l'envoyer par email.

Pour ce dernier point, regarde du côté de la fonction mail()
Dans captcha_valid.php tu mets le code de la fonction mail() à quel place?

Est-ce que cette fonction doit etre dans captcha_valid.php?

Mammouth du PHP | 19672 Messages

20 févr. 2008, 07:37

Autre option simplissime que j'ai utilisé avec succès. J'ai mis ça en place sur un livre d'or en juillet dernier et depuis, je n'ai plus eu un seul spam dessus.

Dans le formulaire de saisie, j'ai un textarea : jusque là, rien que de tout à fait normal. J'en ai mis un second juste après.

Le premier a pour attribut name (et attribut id) "commentaires" et le second "spam" : via une feuille de style externe, je masque l'affichage du textarea "commentaires" (et non "spam", c'est voulu, explications plus loin) avec un : textarea#commentaires {display: none}

Lors de la validation, je vérifie que le contenu de $_POST['commentaires'] est bien vide : un internaute normal ne voit pas ce champ et ne peut rien y mettre. Le robot spammeur en revanche voit parfaitement bien les deux champs et a un certain nombre de mots clés pour contourner les différentes protections : Il se garde donc bien de mettre du contenu dans la zone "spam".

Pourquoi récupérer "spam" et non "commentaires" ? Parce que beaucoup de robots spamment sans même se rendre sur le site : ils ont enregistré le formulaire et envoie une requête http avec un formulaire local directement vers ta page de validation. En changeant le champ que tu récupères, tu rendras obsolète leur copie de ton formulaire.

À partir de là, les seuls spams ne pourront être postés que par un humain. (tant que les robots n'interprètent pas les CSS). Et attention, certains le peuvent peut-être déjà, donc mets bien ça dans une feuille externe, pas dans la balise elle-même.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: