Quelques question sur mon script contact.

WRInaute discret
Bonjour à tous,

J'ai installé sur mon site le script tout fait d'un Formulaire de contact nommé I-Contact.

Rapide d'installation et nécessite quand même quelques retouches [cligne].

Voici le code dans son ensemble (tout est sur la même pas):

Code:
<?php
if (isset($_POST["envoyer"])){ // Si le formulaire a été soumis
    $etat = "erreur"; // On initialise notre etat à erreur, il sera changé à "ok" si la vérification du formulaire est un succès, sinon il reste à erreur

    // On récupère les champs du formulaire, et on arrange leur mise en forme
    if (isset($_POST["son_nom"])) $_POST["son_nom"]=trim(stripslashes($_POST["son_nom"])); // trim()  enlève les espaces en début et fin de chaine

    if (isset($_POST["son_email"])) $_POST["son_email"]=trim(stripslashes($_POST["son_email"])); // stripslashes()  retire les backslashes ==> \' devient '

    if (isset($_POST["son_url"])) $_POST["son_url"]=trim(stripslashes($_POST["son_url"]));

    if (isset($_POST["son_objet"])) $_POST["son_objet"]=trim(stripslashes($_POST["son_objet"]));

    if (isset($_POST["son_message"])) $_POST["son_message"]=trim(stripslashes($_POST["son_message"]));

    // Après la mise en forme, on vérifie la validité des champs
    if (empty($_POST["son_nom"])) { // L'utilisateur n'a pas rempli le champ pseudo
        $erreur="Vous n'avez pas entr&eacute; votre nom..."; // On met dans erreur le message qui sera affiché
        }
        elseif (empty($_POST["son_email"])) { // L'utilisateur n'a pas rempli le champ email
            $erreur="Nous avons besoin de votre e-mail pour vous r&eacute;pondre...";
        }
        elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["son_email"])){ // On vérifie si l'email est bien de la forme messagerie@domaine.tld (cf cours d'expressions régulières)
            $erreur="Votre adresse e-mail n'est pas valide...";
        }
        elseif (empty($_POST["son_objet"])) { // L'utilisateur n'a pas rempli le champ objet
            $erreur="Vous devez entrer l'objet de votre message...";
        }
        elseif (empty($_POST["son_message"])) { // L'utilsateur n'a écrit aucun message
            $erreur="Merci de saisir un message...";
        }
        else { // Si tous les champs sont valides, on change l'état à ok
            $etat="ok";
        }
}
else { // Sinon le formulaire n'a pas été soumis
    $etat="attente"; // On passe donc dans l'état attente
}

if ($etat!="ok"){ // Le formulaire a été soumis mais il y a des erreurs (etat=erreur) OU le formulaire n'a pas été soumis (etat=attente)
    if ($etat=="erreur"){ // Cas où le formulaire a été soumis mais il y a des erreurs
        echo "<span style=\"color:red\">".$erreur."</span><br /><br />\n"; // On affiche le message correspondant à l'erreur
    }
?>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>I Contact</title>
<style type="text/css">
body
{
    margin-left: 285px; 
    width: 450px;
	font-family: "Trebuchet MS", Arial, "Arial Black", "Times New Roman", Times, serif;
    font-size: 0.8em;
	margin-top: 20px;
	margin-bottom: 20px; 
}
label
{
   
   width: 270px;
   font-family: "Trebuchet MS", Arial, "Arial Black", "Times New Roman", Times, serif;
   font-size: 1em;
   color: #2C485C;
   background-color: white;
}
textarea, input
{
   font-family: Vardana, "Trebuchet MS", Arial, "Arial Black", "Times New Roman", Times, serif;
   font-size: 1em;
   color: black;
   background-color: #EFEFEF;
}
img
{
   Border: none;
}
h3
{
   font-family: "Trebuchet MS", "Arial Black", "Times New Roman", Times, serif;
   text-align: center;
   color: #fff;
   background-color: #5183A8;
   width: 390px;
}
.attention
{
   font-size: 1em;
   color: red;
   background-color: #fff;
}
</style>
</head>
<body>
<h3>Testez le formulaire il est désactivé !</h3>
<!-- Formulaire HTML qu'on affiche dans l'état attente ou erreur -->
<form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>"> <!-- Les données du formulaire seront récupérée avec la méthode POST, et action correspond à la page contenant le formulaire -->
    <p style="text-align:left">
        <label for="son_nom">Nom <span class="attention">*</span></label><br /> <!-- Intitulé du champ pseudo -->
        <input type="text" size="40" name="son_nom" id="son_nom" value="<?php
        if (!empty($_POST["son_nom"])) {
        // le pseudo de l'expéditeur a été saisi --> le réafficher
        echo htmlspecialchars($_POST["son_nom"],ENT_QUOTES); // htmlspecialchars() convertit les caractères spéciaux en leurs code html, exemple : & devient &amp;
        }
        ?>" />

        <br />

        <label for="son_email">E-mail <span class="attention">*</span></label><br /> <!-- Intitulé du champ e-mail -->
        <input type="text" size="40" name="son_email" id="son_email" value="<?php
        if (!empty($_POST["son_email"])) {
        // l'e-mail de l'expéditeur a été saisi --> le réafficher
        echo htmlspecialchars($_POST["son_email"],ENT_QUOTES);
        }
        ?>" />

        <br />

        <label for="son_url">URL de votre site</label><br /> <!-- Intitulé du champ url (facultatif) -->
        <input type="text" size="40" name="son_url" id="son_url" value="<?php
        if (!empty($_POST["son_url"])) {
        // l'url a été saisi --> la réafficher
        echo htmlspecialchars($_POST["son_url"],ENT_QUOTES);
        }
        ?>" />

        <br />

        <label for="son_objet">Objet <span class="attention">*</span></label><br /> <!-- Intitulé du champ objet -->
        <input type="text" size="40" name="son_objet" id="son_objet" value="<?php
        if (!empty($_POST["son_objet"])) {
        // l'objet du message a été saisi --> le réafficher
        echo htmlspecialchars($_POST["son_objet"],ENT_QUOTES);
        }
        ?>" />

        <br />

        <label for="son_message">Message <span class="attention">*</span></label><br /> <!-- Intitulé du champ message -->
        <textarea name="son_message" id="son_message" cols="60" rows="10"><?php
        if (isset($_POST["son_message"])) {
        // le message a été saisi --> le réafficher
        echo htmlspecialchars($_POST["son_message"],ENT_QUOTES);
        }
        ?>
</textarea>

        <br /><br />

        <input type="submit" name="envoyer" value="Envoyer" />&nbsp;&nbsp;&nbsp;<input type="reset" name="reset" value="Effacer" />
    </p>
</form>
<!-- FIN du formulaire HTML -->

<?php
}
else { // Sinon l'état est ok donc on envoie le mail
    $son_nom = $_POST["son_nom"]; // On stocke les variables récupérées du formulaire
    $son_email = $_POST["son_email"];
    $son_url = $_POST["son_url"];
    $son_objet = $_POST["son_objet"];
    $son_message = $_POST["son_message"];

    $mon_email = "votreadresse@email.com"; // Mise en forme du message que vous recevrez (Votre adresse email)
    $mon_nom = "Patrick HAMY"; // (Votre pseudo ou votre nom)
    $mon_url = "http://www.patrickhamy.net"; // (Votre site)
    $msg_pour_moi = "- Son nom : $son_nom \n
    - Son E-mail : $son_email \n
    - Son site : $son_url \n
    - Objet du message : $son_objet \n
    - Message : \n $son_message \n\n";

    // Mise en forme de l'accusé réception qu'il recevra
    $accuse_pour_lui = "Bonjour $son_nom,\n
    Votre message nous a bien été envoyé et nous tâcherons de vous répondre le plus rapidement possible.\n\n
    - Votre E-mail : $son_email \n
    - Votre site : $son_url \n
    - L'objet de votre message : $son_objet \n
    - Votre message : \n $son_message \n\n
    Merci et à bientôt sur http://www.patrickhamy.net !"; // (Votre site)

    // Envoie du mail
    $entete = "From: " . $mon_nom . " <" . $mon_email . ">\n"; // On prépare l'entête du message
    $entete .= "MIME-Version: 1.0";

    if (@mail($mon_email,$son_objet,$msg_pour_moi,$entete) && @mail($son_email,$son_objet,$accuse_pour_lui,$entete)){ // Si le mail a été envoyé
        echo "<p style=\"text-align:center\">Votre message a &eacute;t&eacute; envoy&eacute;, vous recevrez une confirmation par mail.<br /><br />\n"; // On affiche un message de confirmation
        echo "<a href=\"" . $mon_url . "\">Retour</a></p>\n"; // Avec un lien de retour vers l'accueil du site
    }
    else { // Sinon il y a eu une erreur lors de l'envoi
        echo "<p style=\"text-align:center; color:green\">Un problème s'est produit lors de l'envoi du message.\n";
        echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Réessayez...</a></p>\n"; // On propose un lien de retour vers le formulaire
    }   
}
?> 
</body>
</html>

Je commence, en Haut du code il y a la fonction pour verifier que tout les champs soit bien remplis à l'envoi du mail.
Si erreur il affiche la phrases du code en haut de la page, en rouge et police basique.

Est il possible de mettre en page ce message d'erreur ? voir meme la remplacer par une image et pourquoi pas la mettre a la suite du champs non validé ?

Autre point délicat [smile]


Code:
// Envoie du mail
    $entete = "From: " . $mon_nom . " <" . $mon_email . ">\n"; // On prépare l'entête du message
    $entete .= "MIME-Version: 1.0";

    if (@mail($mon_email,$son_objet,$msg_pour_moi,$entete) && @mail($son_email,$son_objet,$accuse_pour_lui,$entete)){ // Si le mail a été envoyé
        echo "<p style=\"text-align:center\">Votre message a &eacute;t&eacute; envoy&eacute;, vous recevrez une confirmation par mail.<br /><br />\n"; // On affiche un message de confirmation
        echo "<a href=\"" . $mon_url . "\">Retour</a></p>\n"; // Avec un lien de retour vers l'accueil du site
    }

J'aimerai sur cette partie renvoyer le visiteur vers une page personnalisé et non un page toute faite.
Mais je ne vois pas comment rentrer une url dans ce code.


Sinon y a t'il un avantage d'avoir 2fichier différant pour un formulaire ? Celui- ci tiens sur la même page mais bcp on d'un coté la mise en place dans le fichier html et de l'autre un fichier propre pour les donner du formulaire. Plus de sécurité ?

Et pour finir, justement sur la sécurité, ce formulaire n'est pour le moment pas du tout sécurisé.
Je connais le système Captcha mais franchement pas esthétique.

Je crois savoir qu'il existe quelques technique pour limiter les spam sans forcement que ça soit visible, contrôle du header temps mini pour remplir le formulaire ...

Avez vous des infos ou des conseils ??



Merci a tous [biggrin]
 
WRInaute accro
pour sécuriser, ce que tu peux faire c'est de donner des noms de champs qui dépendront de la session en cours et donc impossible de tenter de spammer le formulaire.
Ensuite, pour empêcher le flood, mettre un délai mini entre 2 validations du formulaire
 
WRInaute accro
pour modifier le message d'erreur, regarde cette ligne
Code:
echo "<span style=\"color:red\">".$erreur."</span><br /><br />\n"; // On affiche le message correspondant à l'erreur
c'est ici que tu fais tes modifications, vu que c'est du HTML on va pas s'attarder :)

pour la redirection en fin d'operation
regarde ces 2 lignes
Code:
echo "<p style=\"text-align:center\">Votre message a &eacute;t&eacute; envoy&eacute;, vous recevrez une confirmation par mail.<br /><br />\n"; // On affiche un message de confirmation
        echo "<a href=\"" . $mon_url . "\">Retour</a></p>\n"; // Avec un lien de retour vers l'accueil du site

et bien remplace les par une redirection
Code:
header('location: ta_page_de_reception.php');
 
WRInaute discret
Bonjour,

Merci pour vos reponses.

KOogar, je vais tester ça ^^

Leonick a tu un lien avec plus de détaille voire même la mise en place des noms par session ?

Merci
 
WRInaute accro
ah oui ? pourtant ca protege que dale ce systeme. faut juste ouvrir une fenetre apres c'est l'autoroute
 
WRInaute accro
KOogar a dit:
ah oui ? pourtant ca protege que dale ce systeme. faut juste ouvrir une fenetre apres c'est l'autoroute
j'introduit une temporisation, c'est à dire qu'après avoir validé un envoi, on ne peut refaire un envoi avant plusieurs minutes. Et puis un formulaire de contact, au delà de 2 envois, c'est plus que louche (pour le 2° on a pu s'apercevoir qu'on avait oublié une info après avoir validé le 1°) et donc soit on blackliste temporairement l'ip, soit on ne tient pas compte de l'envoi.
Et après, il y a d'autres possibilités de bloquages, mais qu'on ne peut dévoiler, sinon les spammeurs s'en serviront :evil:
 
WRInaute accro
le probleme c'est qu'avec un controle sur le rooter (pour changer d'IP) + une console Java le spameur (hacker) va jouer avec ton systeme si il cherche a t'attaquer. Je suis d'accord de l'installer comme un complément ou sur 1 site qui ne sera jamais franchement attaquer, juste un peu spamer. Pour un néophyte, installer une captcha reste la meilleur solution anti spam. Combien font 2+5 ?? simple et facile a installer (2 minutes) et les codes sont portables. A l'inverse modifier tout les noms d'un formluaire, ajouter les verifs, les erreurs, les redirections.. rien de portable.; a monter soi meme :)
 
WRInaute accro
les captcha sont assez facilement contrables d'après ce que j'ai vu sur différents sites.
Ensuite, un captcha ne doit surtout pas faire penser que l'on est à l'abri, il faut obligatoirement lui adjoindre une protection sur le serveur.
Ensuite, pour les formulaires la première des protection consiste à empêcher d'accéder à un formulaire comme page d'arrivée, avec variable de session par cookie.
Les formulaires ne doivent pas être indexés (robots.txt)
Si les cookies ne passent pas, il est fortement probable que ce soit un robot (malveillant ou non) et dans ce cas, ils n'ont pas à accéder au formulaire. Sinon, il faut que l'internaute autorise les cookies.
 
WRInaute accro
KOogar a dit:
ah oui ? pourtant ca protege que dale ce systeme. faut juste ouvrir une fenetre apres c'est l'autoroute

Tu sais je ne voie pas trop ce qui peut arrêter un attaquant dans ce cas là.

Partant du principe qu'une personne déterminée passe partout (normal c'est un humain) alors on peut toujours passer par dessus une protection.

Là ou le système est intéressant (je le répète) c'est qu'il fait reposer la sécurité du formulaire sur un système qui varie donc qui introduit une manipulation supplémentaire au bot de spam (çà met les plus basiques hors course pour un moment)

Bon c'est sur si toi KOogar, ou moi, ou n'importe qui se pose sur le page pour l'étudier ça protègera rien mais les contrôles ne sont pas là pour ça, c'est les Kiddies qui foutent la m--de et eux pour la plupart sont des cancres.
 
WRInaute accro
Leonick a dit:
les captcha sont assez facilement contrables d'après ce que j'ai vu sur différents sites..

Les questions stupides marchent encore assez bien, j'en ai même qui m'écrivent pour dire que la questions est trop facile :lol:
 
WRInaute impliqué
Il existe un système simple à mettre en place contre lequel les robots ne peuvent rien,
enfin pour le moment, ils sont pas encore programmés pour détecter la ruse.
Une fois que le bot a été détecté on break sur le script qui affiche toujours le formulaire.
Mais je dis rien comme l'a dit Leonick, il ne faut pas en parler. :wink:
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut