8768 sujets

Développement web côté serveur, CMS

Bonjour j'aimerais savoir comment sécuriser mon formulaire de contact, récemment j'ai eu la surprise d'avoir 5 mails dans la même seconde et en plus de ça ils étaient vides...
Comment puis-je faire pour permettre un seul mail par ip toutes les 30 minutes (par exemple) et comment faire pour qu'on ne puisse pas remplir avec des champs vides? (j'ai déjà des "required" partout dans mes input html)
Je vous montre mes deux codes, l'HTML:


<form action="contact-mail.php" method="post">
		
<p>
<input type="text" name="prenom" placeholder="Prénom" maxlength="20" size="20" required>
</p>

<p>
<input type="text" name="nom" placeholder="Nom" maxlength="30" size="30" required>
</p>	

<p>
<input type="email" name="email" size="40" maxlength="40" placeholder="Email" required>
</p>

<p>
<input type="text" name="sujet" size="40" maxlength="40" placeholder="Sujet" required>
</p>

<p>
<textarea name="message" rows="4" cols="40" placeholder="Message"  required></textarea>
</p>

<input type="submit" value="Envoyer">
			
</form>


Et voici mon PHP:

<?php

	$prenom = $_POST['prenom'];
	$nom = $_POST['nom'];
	$email = $_POST['email'];
	$sujet = $_POST['sujet'];
	$message = $_POST['message'];
	
	$email_from = 'contact@xxx';
	$email_subject = "xxx Contact - $sujet";
	$email_body = "Nouveau message de $prenom $nom\n\n".
		"Son adresse email: $email\n\n".
		"Son message:\n $message\n\n\n".
		
	$to = 'contact@xxx';
	$headers = "De $email_from \r\n";
		
	
	mail($to,$email_subject,$email_body,$headers);
	
	header("refresh:5;url=index.html");
?>


Merci de votre aide!
salut,

pour éviter les champs vides utilises la fonction php empty.
cette fonction va te permettre de conditionner l'envoi du mail si et seulement toutes les condition son remplis.

il existe tout un tas d'autre fonctions utile pour valider un formulaire (ou simplement des données issues des utilisateurs).
filter_input qui va te permettre de récupérer un champs de formulaire mais aussi d'utiliser les filtres de php


Même si cela ne te protégeras pas vraiment une validation JS (en plus de celle php) du formulaire serait pas mal cela évite l'arriver coté serveur et le retour tes utilisateur te remercieront Smiley cligne (il faut garder la validation php parce que tu ne peux pas être certain que les données arrive de ton formulaire Smiley cligne )

@+
Meilleure solution
Merci des réponses, j'ai donc suivi des cours sur le filtrage et j'obtiens comme code pour remplacer celui que j'ai mit plus haut, celui là:

<?php
// le script en lui même
 
$chaine = $_SERVER['HTTP_REFERER'];
$lg_max=strlen($_SERVER['HTTP_HOST']);
 
if (strlen($chaine) > $lg_max)
{
$chaine = substr($chaine, 7, $lg_max);
}
 
//echo 'resultat :'.$chaine;
 
 
if($_SERVER['HTTP_HOST']!=$chaine){
header('Location:http://www.site.com');exit;
}
?>

Maintenant on ne peut plus allé sur mon fichier php (celui de ma action="xxx.php") via le lien direct site.com/xxx.php par exemple et ça renvois vers site.com.

Et pour ce qui est de la sécurité du formulaire:

<?php
     
    $prenom = $_POST['prenom'];
    $nom = $_POST['nom'];
    $email = $_POST['email'];
    $sujet = $_POST['sujet'];
    $message = $_POST['message'];
     
$options = array(
    'prenom' => FILTER_SANITIZE_STRING,
    'nom' => FILTER_SANITIZE_STRING,
    'sujet' => FILTER_SANITIZE_STRING,
    'email' => FILTER_VALIDATE_EMAIL,
    'message' => FILTER_SANITIZE_STRING
);
 
 
$resultat = filter_input_array(INPUT_POST, $options);
 
        if($resultat['email'] === false) {
            echo "<p id='wrong'>Votre adresse mail n'est pas valide. Vous allez être redirigez vers mon site dans <span id='compt'></span>.</p>";
             
            header("refresh:5;url=index.html");
        }
        else{
             
            echo "<p>Merci pour votre message! Je ferrai mon possible pour vous répondre dans les plus brefs délais. Vous allez être redirigez vers mon site dans <span id='compt'></span>.</p>";
             
            $email_from = 'contact@xxx';
            $email_subject = 'SM.be Contact -' . $sujet . '';
            $email_body = 'Nouveau message de'. $resultat['prenom'] . ' ' . $resultat['nom'] ."\n\nSon adresse email:" . $resultat['email'] . "\n\n\n Son message: \n" . $resultat['message'] . "\n";
                 
            $to = 'contact@sachamarits.be';
            $headers = 'De ' . $email_from . '\n';
             
 
            mail($to,$email_subject,$email_body,$headers);
                 
            header("refresh:5;url=index.html");
        }
 
?>

Voila, en gros dans mon formulaire (que j'ai remis sur mon site) il y a prenom, nom, sujet, email et message, le seul vérifiable est "email" et avec ce code l'email est vérifié et lorsqu'elle est fausse ça n'envois pas de mail et affiche un message d'erreur (+ décompte avant redirection en JavaScript). Pour autant le reste est quand même sécurisé (mais pas vérifié) car en effet les caractères spéciaux sont remplacés avant d'être envoyé par mail: c'est à dire que ' est remplacé par &#39; (par exemple) pour éviter l'utilisation de code.

J'ai testé et tout marche. Pour l'instant ça me semble déjà beaucoup mieux que mon vieux code tout pourri d'avant! Smiley biggrin

Merci de vos réponses, effectivement les filter_input m'ont bien aidé et la vidéo aussi. Smiley cligne
Modifié par SachaMarits (03 Apr 2017 - 23:22)