8791 sujets

Développement web côté serveur, CMS

Pages :
Salut,

J'ai un formulaire en ligne qui vient de m'envoyer le message suivant :

Prenom :EdStlxnTrheEFBCtzyK
Nom :lrszylukac
Profession :oAJDrOMojhNBbQrfJ
Adresse :zv33KK  <a href="http://*********.com/">*******</a>, [url=http://***********.com/]********[/url], [link=http://*********.com/]********[/link],  http://********.com/
 
Code Postal :BuFkYAFhQ
Ville : iTfvyYtbeFhOsLm
Pays : Nicaragua
Telephone : YjvVVdYzmNqOlB
Fax : MtUEleNyZqPHuvqBtVJ
Reduction SNCF : Oui
Repas : Oui
Email : grgrjh@vgrqsc.com


Mmhhhh... pas génial hein ?
Vous en pensez quoi, mon code est percé ?

Merci
Sam
Modifié par dew (26 Jan 2010 - 17:45)
Salut,

Non, tu as simplement reçu du spam envoyé par un spambots. Cela veut dire que ton formulaire ne permet pas d'y parer, il te faudrait donc rajouter une validation avant l'envoi des messages.
Modifié par Mikachu (15 Nov 2009 - 12:04)
Hello,

la sécurité en PHP est un vaste domaine mais concernant les mails le B.A.BA. est d'empêcher l'inclusion d'éléments HTML (typiquement des liens) dans les variables postées via un formulaire.

Le plus simple est de ne les utiliser qu'après les avoir fait passer par un htmlspecialchars ou un strip_tags.
Ok merci, +1 pour le spambot mais c'est tellement incohérent, url abstraite, suite de caractères
sans logique etc... que je me posais la question de la finalité du truc ?

Je vais peaufiner avec un htmlspecialchars effectivement.

Un captacha me rebutait un poil car le formulaire est déja assez long a remplir mais bon,
je crois que je vais pas y couper...

Si autres infos et/ou solutions, je suis preneur quoi qu'il en soit.

Merci encore,
Sam
Hello,

en parlant de "htmlspecialchars", j'ai déjà ça dans mon formulaire :
Exemple :

<p><label for="prenom">Prénom</label>
        <input type="text" size="40" name="prenom" id="prenom" value="<?php
        if (!empty($_POST["prenom"])) {
		echo htmlspecialchars($_POST["prenom"],ENT_QUOTES);
        }
        ?>" />
</p>


Que me faut-il ajouter pour parer un peu mieux les spambots ?

Merci...
Modérateur
Hello Samiaule,

Samiaule a écrit :

Que me faut-il ajouter pour parer un peu mieux les spambots ?


En faisant simple, tu peux faire un captcha. Soit textuel méthode la plus accessible ou sous forme d'image avec sa méthode peu accessible. Si tu choisies un captcha en image, évite d'utiliser imagemagick et Magickwand. Ce sont des objets très intéressant. Néanmoins, quand les effets sont trop poussés, l'image devient illisible.

Bonne journée à toi
tu peux vérifier un peu mieux la cohérence des infos qui te sont fournies.

email: http://php.net/filter_var + un check MX

pour les liste déroulant vérifier que ce que tu reçois était bien dans ta liste fournie (c'est rare, et généralement c'est plus pour des tentative d'intrusion -certains néophyte pense pas à sécuriser les input de ces champs- que des spambot )

idem pour les numéro de fax/phone: normalement tu dois avoir que des chiffre éventuellement des signe (, ), +, -, / ou .(le point) ou encore des espace pour séparer les chiffres.

pour les prénoms, noms y a aussi des patterns élémentaire pour éviter les truc les plus gros (généralement si t'as un chiffre ou des majuscule en plein milieu du prénom/nom c'est que y a quelque chose qui cloche)

pour les villes -voir adresse- (au moins pour un semblant de validation: tu joue aussi au "bot" et tu vas taper du coté de l'API Google Maps Geo-Coding pour faire valider ce qu'on te refile )

avant le captcha; le truc bête et méchant c'est le champ input bidon (tu le cache par css) parfois ça marche même avec un champ input en hidden vide => le spambot idiot va parfois le remplir; normalement pas un utilisateur humain

p.s.
note que toute ces validation sont facilement contournable par un bot un minimum "intelligent".
Modifié par arukab (16 Nov 2009 - 15:36)
Ok merci pour ces infos alternatives, je voulais éviter le captcha mais là je crois que je vais pas y couper...

Si on supprimait les bots, le spam et I.E la vie serait plus simple n'est-ce pas ?
Smiley lol

@+
Depuis quelques temps j'utilise sur de petits sites sans besoins de sécurité ultra-performants la technique du "faux captcha" qui donne pour l'instant 100% satisfaction : 0 spam.
Tu places un input txt en {display:none;visibility:hidden;top:2000px} ou tout ce que tu voudras pour qu'il n'apparaisse pas et tu analyses les retours... si le champ revient rempli c'est un bot OU un utilisateur sans CSS ou en vocal. Pour ces derniers tu précises par ex dans le label : "zone de sécurité, ne pas remplir SVP";
Modifié par Arsene (17 Nov 2009 - 12:00)
Hello, (le retour)

Fort de toutes ces préconisations je me suis mis au taff sur un captcha (à tes souhaits!)

Ca roule mais j'ai un pb avec la validation.

J'ai 4 fichiers :

- MaPagePrincipale

<div id="formulaire"> 
<?php
    if ($etat!="ok"){
	// le formulaire n'a pas été soumis, ou soumis avec une erreur
	if ($etat=="erreur"){
	//le formulaire a été soumis avec une erreur
	echo $erreur;
	// afficher le message d'erreur
	}
?>

<form method="post" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>">	
		
        <p><label for="prenom"><p>prenom</p></label>
        <input type="text" size="40" name="prenom" id="prenom" value="<?php
        if (!empty($_POST["prenom"])) {
		echo htmlspecialchars($_POST["prenom"],ENT_QUOTES);
        }
        ?>" />
        </p>
		
        <p><label for="nom"><p>nom</p></label>
        <input type="text" size="40" name="nom" id="nom" value="<?php
        if (!empty($_POST["nom"])) {
		echo htmlspecialchars($_POST["nom"],ENT_QUOTES);
        }
        ?>" />
        </p>

		<p><label for="profession"><p>profession</p></label>
        <input type="text" size="40" name="profession" id="profession" value="<?php
		if (!empty($_POST["profession"])) {
        echo htmlspecialchars($_POST["profession"],ENT_QUOTES);
        }
        ?>" />
        </p>
			
		<p><label for="email"><p>mail</p></label>
        <input type="text" size="40" name="email" id="email" value="<?php
        if (!empty($_POST["phone"])) {
		echo htmlspecialchars($_POST["phone"],ENT_QUOTES);
        }
        ?>" />
        </p>
		
		<p><label for="captcha"><?php echo CAPTCHA; ?><br />
		<img src="inc/captcha.php" alt="Captcha" /></label>
        <input type="text" name="captcha" id="captcha" />
		</p>
		
        <p><a><input class="button" type="submit" name="envoyer" value="envoi" />
        </a></p>
        </form>

		
		
		
<?php
}
else {
// le formulaire a été soumis sans erreur, on envoie le email 
                $entete = "From: ".$_POST["email"]." <".$_POST["email"].">\n";				
                $msg =  
                'Prenom :'.$_POST["prenom"]."\n". 
                'Nom :'.$_POST["nom"]."\n". 
                'Profession :'.$_POST["profession"]."\n". 
                'Email : '.$_POST["email"]."\n"; 
                 
				if (mail($email_webmaster.','.$_POST["email"],$entete,$msg)){  				
                
 
// mail envoyé 
                echo <p>MessOK</p>; 
                echo <p>NewMail</p>; 

        } 
        else { 
// erreur lors de l'envoi du mail 
                echo <p>Problem</p>; 
                echo <p>Retry</p>; 
        } 
} 
 
?>    
  
</div>

- Dans laquelle j'ai include "<?php include('inc/form.inc.php'); ?>" mon Formulaire.
- Et "formulaire.php"


$email_webmaster = "moimeme@serveur.fr";

		if (isset($_POST["envoyer"])){
		// le formulaire a été soumis
        $etat = "erreur";// Valeur par défaut. Prendra la valeur "ok" s'il n'y a pas d'erreur
		
		
		// --- mise en forme des champs saisis dans le formulaire lors de sa soumission ---
		
		if (isset($_POST["prenom"])) {
                 $_POST["prenom"]=trim(stripslashes($_POST["prenom"]));
        }
		if (isset($_POST["nom"])) {
                 $_POST["nom"]=trim(stripslashes($_POST["nom"]));
        }
		if (isset($_POST["profession"])) {
                 $_POST["profession"]=trim(stripslashes($_POST["profession"]));
        }
		
        if (isset($_POST["email"])) {
                 $_POST["email"]=trim(stripslashes($_POST["email"]));
        }
		if (empty($_POST["email"])) {
                 $erreur=TXT_erreur_email; 
        }
		
///////////// --- test de la validité des champs saisis ---
		
		
        else if (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email"])){
///////////// l'adresse e-mail n'est pas valide
                 $erreur=TXT_erreur_mailinvalide; 
        }
		else if (empty($_POST["prenom"])) {
                 $erreur=TXT_erreur_prenom; 
        }
		else if (empty($_POST["nom"])) {
				 $erreur=TXT_erreur_nom; 
        }
		else if (empty($_POST["profession"])) {
                 $erreur=TXT_erreur_profession; 
        }
	
		
        else {
		// --- tous les champs sont correctement remplis: on pourra envoyer le mail ---
                 $etat="ok";
        }
}
		else {
		// --- le formulaire n'a pas été soumis ---
           $etat="attente";
}


Et bien sur mon "captcha.php" qui marche nickel...

le pb est que je n'arrive pas obliger la verification avec çà que je ne sais pas où mettre ??? :

	if(!empty($_POST['captcha'])) {
            if(isset($_SESSION['captcha']) && $_POST['captcha'] == $_SESSION['captcha'])
                echo 'Le captcha est bon, votre ok';
            else
                echo 'La captcha n\'est pas bon.';
                
            session_destroy(); // Pour eviter les multiposts.
        }


Merci...
Sam(fatigué)
Modérateur
Hello,

Pour te mettre sur lavoie, que veut dire :

if(!empty($_POST['captcha'])) {
//etc.
}


@+
ha cher Nolem... t'es encore dans les parages ! :o)
J'ai fini par trouver :

else if (isset($_SESSION['captcha']) && $_POST['captcha'] != $_SESSION['captcha']){
				  $erreur=CAPTCHA_INVALIDE;
            session_destroy();
        }

et je me suis payé aussi un petit :
<p><input type="hidden" name="protection" value="" />
		</p>

avec çà derrière :
if (!empty($_POST['protection']) || $_POST['protection'] !== ''){
				 $erreur=SPAM;
		}	


Je pense que je devrais être tranquille un moment... et toi aussi !
Smiley biggol

Merci encore !
Sam
Un truc qui marche bien aussi c'est la simple addition de deux chiffres Smiley rolleyes

Ça doit être trop dur pour les robots car je ne suis plus spammé sur mon livre d'or. (1 ou 2 messages par an...) alors que j'en recevais en pagaille malgré un captcha auparavant...

La technique du champs à ne pas remplir fonctionne très bien aussi.
Salut à tous et... mes bons voeux par la même...

J'étais plutot satisfait de mon formulaire jusqu'à là, mais depuis le début de l'année je reçois
une tripotée de spam, un bot certainement, bien que j'ai un Captcha, des champs cachés etc...

Prenom : gHPhUpbYLSqpTyFDx
Nom : Justin
Profession : kvCtGWvBZFinPt
Adresse : buy acomplia online without a prescription <a href="http://brazil.mcneel.com/members/Acomplia-Buy-Online.aspx">buy generic acomplia online</a> acomplia buy online New York
Code Postal : nFJxWWVQ
Ville : rEGlGycrcRjINhURV
Pays : France
Telephone : eecaAwTBgb
Fax : rDLgNnejhzFbOxnO
Reduction SNCF : Oui
Repas : Oui
Email : JustinLNagel@text2re.com


Il me faut donc coder de manière à ce que certains champs remplissent les conditions d'envoi.
(enfin je pense...)

Exemple :
- interdire l'ajout d'url dans le champ "Adresse".
- obliger chiffres dans le champ "Telephone"
- etc...

J'aurais besoin d'un ptit coup de mains pour çà svp.


Voici le détail du code :

$email_webmaster = "monmail@fai.fr";
============================================================
		if (isset($_POST["envoyer"])){// le formulaire a été soumis
		
		
        $etat = "erreur";// Valeur par défaut. Prendra la valeur "ok" s'il n'y a pas d'erreur
		
		
		
		if (isset($_POST["adresse"])) {
                 $_POST["adresse"]=trim(stripslashes($_POST["adresse"]));
        }
		if (isset($_POST["phone"])) {
                 $_POST["phone"]=trim(stripslashes($_POST["phone"]));
        }
        if (isset($_POST["email"])) {
                 $_POST["email"]=trim(stripslashes($_POST["email"]));
        }
        if (isset($_SESSION['captcha']) && $_POST['captcha'] == $_SESSION['captcha']){
                  $_POST["captcha"]=trim(stripslashes($_POST["captcha"]));
        }
		
///////////// --- CHAMP HIDDEN ---///////////////////////////
		if (!empty($_POST['protection']) || $_POST['protection'] !== ''){
				 $erreur=SPAM;
		}	
///////////// --- CHAMP HIDDEN ---///////////////////////////	
		
		
        else if (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email"])){
///////////// l'adresse e-mail n'est pas valide
                 $erreur=TXT_erreur_mailinvalide; 
        }
		else if (empty($_POST["adresse"])) {
                 $erreur=TXT_erreur_adresse; 
        }
		else if (empty($_POST["phone"])) {
                 $erreur=TXT_erreur_phone; 
        }
		else if (empty($_POST['captcha'])) {
				 $erreur=CAPTCHA_VIDE; 
        }
		else if (isset($_SESSION['captcha']) && $_POST['captcha'] != $_SESSION['captcha']){
				  $erreur=CAPTCHA_INVALIDE;
            session_destroy(); // Pour eviter les multiposts.
        }
        else {
		// --- tous les champs sont correctement remplis: on pourra envoyer le mail ---
                 $etat="ok";
        }
}
		else {
		// --- le formulaire n'a pas été soumis ---
           $etat="attente";
}


Et le formulaire :

<div id="formulaire">

<?php
    if ($etat!="ok"){
	// le formulaire n'a pas été soumis, ou soumis avec une erreur
	if ($etat=="erreur"){
	//le formulaire a été soumis avec une erreur
	echo $erreur;
	// afficher le message d'erreur
	}
?>



		<form method="post" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>">	
		

        <p><label for="adresse"><?php echo CONTACT_adresse; ?></label>
        <textarea name="adresse" id="adresse" cols="40" rows="5"><?php
        if (isset($_POST["adresse"])) {
		echo htmlspecialchars($_POST["adresse"],ENT_QUOTES);
        }
        ?></textarea>
        </p>

		<p><label for="phone"><?php echo CONTACT_phone; ?></label>
        <input type="text" size="40" name="phone" id="phone" value="<?php
        if (!empty($_POST["phone"])) {
		echo htmlspecialchars($_POST["phone"],ENT_QUOTES);
        }
        ?>" />
        </p>

		
		<div id="capt"><label for="captcha"><?php echo CAPTCHA; ?></label>
		<input class="keycode" type="text" name="captcha" id="captcha" value="" />
		<img src="inc/captcha.php" alt="Captcha" />
		</div>

		
		<p><input type="hidden" name="protection" value="" />
		</p>
		
		
        <p><a><input class="button" type="submit" name="envoyer" value="<?php echo CONTACT_envoi; ?>" />
        </a></p>
        </form>

		
		
		
<?php
}
else {
// le formulaire a été soumis sans erreur, on envoie le email 
			
                $entete = "From: ".$_POST["email"]." <".$_POST["email"].">\n";		
                $entete = 'Inscription depuis le site';				
                $msg =  
                'Adresse : '.$_POST["adresse"]."\n". 
                'Telephone : '.$_POST["phone"]."\n". 
                'Email : '.$_POST["email"]."\n"; 
                 
				if (mail($email_webmaster,$entete,$msg));  

				
				
			
$subject = '-:: Votre inscription / Your registration::- ';
$msg = 'Merci / Tank you : '.$_POST["nom"]."\n".
$msg = 'Votre inscription / Your registration : '."\n".

$msg =
'

'Adresse : '.$_POST["adresse"]."\n". 
'Telephone : '.$_POST["phone"]."\n". 
'Email : '.$_POST["email"]."\n".

$msg =
'
Votre inscription a été correctement enregistrée.

				if (mail($_POST["email"], $subject, $msg)){				
                
 
// mail envoyé 
                echo TXT_MessOK; 
                echo TXT_NewMail; 
        } 
        else { 
// erreur lors de l'envoi du mail 
                echo TXT_Problem; 
                echo TXT_Retry; 
        } 
} 
 
?>    
  
</div>


Si une bonne âme pouvait m'aider je suis preneur...

Merci
Salut,

Tu peux déjà vérifier si le formulaire est valide. Donc comme dit plus haut :
- téléphone, fax : constituer de chiffre et des fois espace/tiret
- ville, pays, nom et prénom : sans numéro
- le code postal est nombre
- un email valide
- la valeur de repas et réduction est égal à oui ou non
Modifié par jo_link_noir (10 Jan 2010 - 14:47)
jo_link_noir a écrit :
le code postal est nombre

Un utilisateur qui n'est pas un spammeur et qui habite au Royaume-Uni ou au Canada aura des difficultés à soumettre le formulaire s'il est filtré ainsi, puisque son code postal comporte des lettres en plus de chiffres. Smiley cligne

Samiaule, je te conseille d'abandonner les fonctions ereg_* () et eregi_* () : elles sont en voie d'obsolescence (PHP 5.3 génère un avertissement en ce sens) ; utilise à leur place les expressions régulières compatibles PERL (notamment avec la fonction preg_match ()), qui sont plus performantes. Quant à la validation de l'adresse électronique, tu peux utiliser filter_var () :
if (!filter_var ($_POST['email'], FILTER_VALIDATE_EMAIL))
{
  // Traitement en cas d'adresse électronique invalide
}
else
{
  // Traitement en cas d'adresse valide
}

Modifié par Victor BRITO (10 Jan 2010 - 15:08)
merci pour ces précieux conseils...

Cependant, que dois-je faire pour interdire les "http://...." dans les champs ?

@+
Modifié par Samiaule (10 Jan 2010 - 17:38)
Yep merci shaihulud1979, çà me parait bien dans le style de ce que je recherche...
J'adapte, je mets en test et je raconte...
@+
Sam
Modifié par Samiaule (12 Jan 2010 - 09:58)
shaihulud1979 a écrit :
Jette voir un oeil là dessus, je pense que tu pourras t'en inspirer pour faire un contrôle de ton champ de saisi. Le principe c'est de vérifier lors de la saisie à chaque levé de touche si l'expression saisie correspond à un interdit. En l'adaptant tu pourras interdire les http et les www.

Sauf qu'une vérification en JavaScript n'est pas suffisante. D'ailleurs, il n'est pas exclu que les robots spammeurs ne lisent pas le JavaScript. Smiley cligne
Pages :