2009-05-10 11 views
1

Folks,Prévention des liens de site Web et adresses e-mail dans un formulaire lorsque « SOUMETTRE » est pressé

Je dispose d'un formulaire HTML qui envoie les données de formulaire comme un email. Malheureusement, les robots spammeurs remplissent le formulaire et envoient des liens vers des sites Web et des adresses e-mail dans la partie message du formulaire.

Est-il possible de supprimer les liens et les adresses e-mail du site Web lorsque le bouton "Soumettre" est enfoncé avant d'être envoyé comme adresse e-mail? J'utilise PHP pour envoyer les données du formulaire en tant que message électronique.

Merci et salutations,

Tony

Répondre

0

Comment l'utilisation des expressions régulières pour remplacer tout ce qui correspond à un lien Web ou l'adresse e-mail à une chaîne vide.

Vous pouvez trouver des tons d'exemples d'expressions régulières sur le web, il suffit de Google

6

Avez-vous essayé d'avoir un hidden form via css (display: none) mais en HTML comme une forme régulière, et l'appeler par courriel ou par quelque chose de commun, et si cette forme a des données, alors il doit s'agir d'un bot.

+1

intelligent! (15 caractères) – nickf

0

Vous pouvez le faire avec Javascript. Le problème est que Javascript doit être activé pour que cela se produise afin que vous puissiez imaginer les chances que les spambots seront coopératifs quand il s'agit de cela.

Vous allez devoir le filtrer sur le serveur. Personnellement, je rejetterais purement et simplement tout message contenant des liens ou des adresses e-mail. Crache une erreur à l'utilisateur mais ne l'enregistre même pas.

Pour quelques conseils sur la détection de spam en PHP, lisez Spam-free accessible forms.

Vous pouvez également envisager l'utilisation de CAPTCHA.

0

Vous devez parcourir tous les champs du tableau $ _POST (au moins ceux dans lesquels vous ne voulez pas avoir d'e-mails ou de liens) et le comparer à quelques expressions rationnelles.

La suggestion d'utiliser CAPTCHA est également bonne.

Quoi qu'il en soit, voici une implémentation merdique de la vérification:

class ValidationHelper 
{ 
    // Regex taken from https://github.com/google-code-export/prado3/blob/master/framework/Web/UI/WebControls/TEmailAddressValidator.php 
    const EMAIL_REGEX = "#\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*#"; 

    // hacked up regex that I just cooked up - could be hugely improved i'm sure. 
    const LINK_REGEX = "#(h\s*t\s*t\s*p\s*s?|f\s*t\s*p)\s*:\s*/\s*/#"; 

    public static function containsEmail($value) 
    { 
     if (preg_match(self::EMAIL_REGEX, $value)) 
      return true; 

     return false; 
    } 

    public static function containsLink($value) 
    { 
     if (preg_match(self::LINK_REGEX, $value)) 
      return true; 

     return false; 
    } 
} 

$errors = array(); 
foreach ($_POST as $key=>$value) { 
    // presumably you want at least one email field, yeah? 
    if ($key != 'email') { 
     // perhaps you should be running strip_tags over everything if you don't want html and such... 
     // see http://php.net/strip_tags for more info. without it (or something similar), there's nothing 
     // to stop people from putting <script type="text/javascript" src="http://notyourdomain.com/~1337skriptkiddy/haxxors.js"></script> 
     // into your form. even if you might not necessarily ever be displaying this in a scenario 
     // where it can cause trouble, it's never a bad idea to stop this stuff *before* it gets into your db 
     $_POST[$key] = $value = strip_tags($value); 
     if (ValidationHelper::containsEmail($value) || ValidationHelper::containsLink($value)) 
      $errors[] = 'Please ensure the value you entered for '.$fieldNames[$key].' does not contain any links or email addresses'; 
    } 
} 

if (!empty($errors)) { 
    // failed - show errors. 
} 
else { 
    // success! 
} 
+0

Pourquoi itérer? Juste les concaténer avec un espace entre les deux, et lancer l'expression rationnelle sur le résultat ... – Eli

+0

Parce que je prescrit que strip_tags être exécuté sur chaque valeur pour l'assainir avant qu'il ne soit vérifié. Vraisemblablement, quelque chose devra être fait avec les données après (de manière à le sauvegarder dans une base de données), ce qui signifie que la désinfection doit être effectuée champ par champ. Je suppose que vous pourriez concaténer pour faire la regex et encore itérer pour faire l'assainissement, mais cela me semble une micro-optimisation. – Shabbyrobe

0

Eh bien, si votre voulez vraiment lutter contre le spam, aller pour ces étapes:

  1. Mettez un CAPTCHA sous la forme si que les non-humains ne peuvent même pas soumettre la forme. Une implémentation CAPTCHA très populaire est reCAPTCHA.

  2. Faites un strip_tags sur les champs afin que même si quelqu'un met les URL à la main, il sera supprimé.

  3. Effectuez une vérification d'expression régulière pour les adresses e-mail et supprimez-les également. Choisissez une bonne expression regex sur le web qui choisira la plupart des formats d'email.

Espérons cette aide. À votre santé!

0

Vraisemblablement, vous ne voulez pas accepter n'importe quel type de HTML, juste du texte? Dans ce cas, strip_tags est votre ami. strip_tags vous permet également de spécifier des tags acceptables. Je recommande également vivement d'incorporer un header-injection defence script.

0

Folks,

J'essayé d'utiliser strip_tags qui supprime certainement des balises mais ne supprime pas « mailto: »: texte, de sorte que les liens sont encore des liens, ni « http: // ».

Existe-t-il une commande ou une routine PHP simple qui peut analyser une chaîne et remplacer "mailto:" et/ou "http: //" par une chaîne vide inoffensive "" dans ces parties de la chaîne?

Essayé googler aussi, mais la plupart des choses que j'ai trouvé au sujet de l'espace blanc, etc. parage

Désolé, je suis un peu nouveau pour PHP.

Merci et salutations,

Tony

+0

Cela devrait fonctionner (ne l'a pas testé). $ input = preg_replace (array ("/ mailto: [^] */i", "/ http: \/\/[^] */i"), "", $ input); –

0

Ceci est très simpliste, mais vous pouvez construire là-dessus, je suis sûr que ...

Essayez d'ajouter une photo d'un chat ou d'un chien, puis leur demandant d'entrer le nom en trois lettres de l'animal montré ... ou quelque chose de similaire. Faire un contrôle de validation, puis partir de là ... Captcha pas cher et facile. De cette façon, seule l'entrée humaine sort.

+0

Bot aurait une chance de 50/50 à ce sujet. –

+0

Comment ça ... depuis quand les robots interprètent-ils les images? –