Pour corriger un regex

Eléphant du PHP | 271 Messages

17 nov. 2007, 10:58

Bonjour,

Je souhaite que ce type de message intempestif issu de robots n'apparaisse plus dans mon livre d'or

Code : Tout sélectionner

<a href= http://free-gay-teenstudio-galleries.kosoze.com >st petersburg ymca</a>
Pour cela je pense qu'il faut écrire un regex et j'ai fais ça mais bon...ça ne fonctionne pas
 if(preg_match("#?[-a-z0-9._\"\(çàâäêëùîï@\)\[\]\'\}]#i", $message))
Peut on m'aider à la corriger ?
Patience et obstination sont des qualités !

Mammouth du PHP | 19672 Messages

17 nov. 2007, 11:57

Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1380 Messages

17 nov. 2007, 12:00

Pourrais-tu préciser ta demande. C'est le lien que tu donnes que tu veux filtrer?

Donne un exemple du texte à détecter.
ripat

Eléphant du PHP | 271 Messages

17 nov. 2007, 12:54

Pour répondre à Cyrano :

Suite à la proposition de l'autre post j'ai fait ça il y a quelques jours mais le problème persiste :

Code : Tout sélectionner

<div> <label for="nom">Nom ou Pseudo</label> <INPUT TYPE="TEXT" id="nom" NAME="nom" VALUE=""> </div> <div> <label for="sujet">Message</label> <TEXTAREA NAME="spam" ROWS=5 COLS=50></TEXTAREA> </div> <TEXTAREA NAME="message" ROWS=5 COLS=50 style="display:none;"></TEXTAREA> <INPUT TYPE="HIDDEN" NAME="debut" VALUE="<? echo "$debut"; ?>"> <div> <input type="reset" id="reset" name="Submit" value="Tout effacer"> <input type="submit" id="submit" name="Submit" value="Signer le livre d'or"> </div>
Je précise que les TEXTAREA sont déjà traité en fichier CSS externe d'où

Code : Tout sélectionner

<TEXTAREA NAME="message" ROWS=5 COLS=50 style="display:none;"></TEXTAREA>
J'espère m'être bien expliqué et je ne vois pas comment faire autrement sauf si je n'ai pas bien intreprété les explications de l'autre post.
Patience et obstination sont des qualités !

Eléphant du PHP | 271 Messages

17 nov. 2007, 13:02

Pour répondre à Ripat :
Voici le type de message que je reçois :

Code : Tout sélectionner

<a href= http://free-gay-teenstudio-galleries.kosoze.com >st petersburg ymca</a> <a href= http://abril-teenstarsmagazine.kosoze.com >eagle talon awd tsi</a> <a href= http://www-indien-porno-com-2-3.kosoze.com >steps in scientific method</a> <a href= http://xx-cel-video-monica.kosoze.com >kohler</a> <a href= http://yorgelis-delgado-sex.kosoze.com >pictures of nude models</a> <a href= http://16-yo-fucking--lang-en-all.kosoze.com >toyota camry solara</a> <a href= http://yfp-t-471-s-movieformuz-f.kosoze.com >spiderman movie</a> <a href= http://xxxuploads-com-free-realty.kosoze.com >donovan concert schedule</a> <a href= http://www-friends-fuckers-com.kosoze.com >geauga county newspapers</a> <a href= http://yourfilehost-fistfuck-.kosoze.com >online surveys</a>

Je souhaite bien sur que le traitement le refuse. Voila ce que je fais en traitement :
if(isset($_POST['spam']))     $message=htmlspecialchars(stripslashes($_POST['spam']), ENT_QUOTES);
else      $message="";
	$message = nl2br($message);
Mais ces messages de robots continus. Je pense qu'avec un regex c'est possible mais mais malgré le tuto du site du zéro..durdur...
Patience et obstination sont des qualités !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 nov. 2007, 13:10

En solution simple, regarde si ton message contient le mot "http", chose qui n'a rien à faire dans un livre d'or, et si tel est le cas, tu le vires et c'est terminé ;)

Mais la solution donnée par Cyrano me semble la plus propre et la plus efficace, j'ai moi même opté pour ce genre de solution et le spam a disparu du jour au lendemain...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 19672 Messages

17 nov. 2007, 13:18

alaingpl, tu as visiblement lu ma suggestion en diagonale.
-1- traiter l'affichage dans une feuille externe, ça évite que le robot puisse lire "display:none" dans la balise elle-même.
-2- pour n'affecter que cette balise à partir de ta feuille externe, ajoute un id, donc pas juste name="message" mais également id="message" et depuis ta feuille CSS externe, du mets textarea#message {display: none}

Enfin, tu peux le mettre dans le même <div> que l'autre.

Je te garantis que ça fonctionne très bien, encore une fois, je l'ai mis en place sur 2 LO et depuis juillet, je n'ai plus de problème avec ça.

Et comme il m'arrive d'avoir un esprit caustique, si lors du traitement je trouve un contenu dans le textarea "message", je fais une redirection automatique vers un site traitant de cybercriminalité :mrgreen:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 271 Messages

19 nov. 2007, 17:58

J'ai fait exactement ce que m'a écrit Cyrano et je le remercie beaucoup.
Je marque ce post résolu et j'attend quelques jours pour voir si les robots spamme toujours mon L.O. .
Merci encore.
Patience et obstination sont des qualités !

Eléphant du PHP | 271 Messages

19 déc. 2007, 01:17

Rebonjour,

Voila maintenant 1 mois que j'ai modifié mon formulaire et tout se passer bien jusqu'à il y a quelques jours. Mon L.O. est à nouveau spammé par les robots avec les mêmes types de messsages.
Aprés une exploration dans les messages du forum et suite aux conseils de Ryle j'ai trouvé le code ci-dessous puis légérement modifié mais à nouveau cela ne fonctionne pas.
if (preg_match("/\bHTTP\b/i", $message)) {
    echo "Vous ne pouvez pas poster";
}
Est ce que quelqu'un peut me mettre sur la voie et notamment m'indiquer quelle fonction dois je utiliser pour faire ça : si (chaine de caractère = http, href de $message)=vrai alors : vous ne pouvez pas poster.

Merci d'avance de l'aide.
Patience et obstination sont des qualités !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 déc. 2007, 11:06

Pourquoi la limite de mot ? pourquoi pas simplement :
if (preg_match("/HTTP/i", $message)) { 
    echo "Vous ne pouvez pas poster"; 
}
Quand tu dis que ça ne fonctionne pas, as-tu un exemple de ce qui a passé ce test ?


Et à la place du style="display:none;" dans l'input (ou le textarea) je te recommande de lui donner un id ou une classe et de définir le style dans un css, ce qui sera à mon avis beaucoup plus efficace (les robots n'en étant pas encore à aller chercher dans les feuilles de style pour voir si un input est présent ou pas), ou pour augmenter encore la difficultée, le placer dans un span qui aura cette classe.. c'est pas insurmontable comme protection, mais ça en éliminera déjà pas mal :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 271 Messages

19 déc. 2007, 18:45

Bonjour,
Quand tu dis que ça ne fonctionne pas, as-tu un exemple de ce qui a passé ce test ?
Quand j'écris dans le formulaire du L.O. "HTTP" il valide et l'affiche comme un message normal. Il n'est pas stoppé.

Actuellement mon formulaire est écrit de la façon suivante :

Code : Tout sélectionner

<div> <label for="sujet">Message</label> <TEXTAREA NAME="spam" ROWS=5 COLS=50></TEXTAREA> <TEXTAREA NAME="message" id="message" ROWS=5 COLS=50></TEXTAREA> </div>
et le CSS correspondant est :

Code : Tout sélectionner

textarea { color:#0000FF; width:400px; height:150px; margin-bottom:1em; } textarea#message {display:none;}
Je pense avoir interprété correctement les conseils de Cyrano sinon je ne sais pas où j'ai fait une ou les erreurs.
Merci de m'aider.
Patience et obstination sont des qualités !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 déc. 2007, 21:58

Alors là, j'ai pas d'explication. La chaine "HTTP" respecte ton masque, donc tu devrais rentrer dans le if() et afficher le message. Es-tu sur que le reste du code n'est pas interprété ?

Colle des echo à tout va, affiche tes valeurs, regarde dans quelles structures tu passes et avec quelles valeurs pour essayer de comprendre comment ça peut passer à travers...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 271 Messages

20 déc. 2007, 01:59

Voici toute la page qui traite mon L.O.. Pour moi avec ma petite expérience en php je ne vois pas d'erreur sauf que :
Quelque soit le message posté l'echo "vous ne pouvez pas poster" s'affiche dans les remerciements
<link href="../style.css" rel="stylesheet" type="text/css">

<?PHP
	   require('admin/config.php'); 
	
	// On commence par récupérer les champs 
if(isset($_POST['spam']))     $message=htmlspecialchars(stripslashes($_POST['spam']), ENT_QUOTES);
else      $message="";
	$message = nl2br($message);
	$dater=date("Y-m-d H:i:s");

if (preg_match("/HTTP/i", $message))
{  
    echo "Vous ne pouvez pas poster";  
} 

//if(preg_match("#?[-a-z0-9._(çàâäêëùîï@\)[]'}]#i", $message))

if(empty($message))
    {
 echo"<br /><br />";
echo"<table width=\"400\" border=\"1\" align=\"center\">";
 echo"<tr>\n";
    	echo"<td width=\"400\"> <p align=\"center\"><br /></p>";
     		 echo"<div align=\"center\">Bonjour,<br /><br />Vous avez oublié de taper votre message.<br /></div><br /><br />";
			 echo"<div align=\"center\"><a href=\"javascript:history.go(-1)\";><font color=#0066CC>Pour retourner au livre d'or, <strong>cliquez ici      	</strong></center></div>";	  
 echo" <br /><br />";
      echo"</td>\n";
  echo"</tr>\n";
echo"</table>";
echo"<br /><br /><br /><br />";
}

 

else
{
	 //connection à la base de données//
		mysql_connect($localhost,$login,$mot) OR die("Erreur !<br/ >" .mysql_error());  

// je me rend sur notre base de donnée 
mysql_select_db($dbName) OR die("Erreur !<br />" .mysql_error()); 

{
		$req=mysql_query("INSERT INTO message (nom, message, dater) VALUES ('$nom','$message','$dater')");
}
{ 
echo"<br /><br />";
echo"<table width=\"400\" border=\"1\" align=\"center\">";
 echo"<tr>\n";
    echo"<td width=\"400\"> <p align=\"center\"><br /></p>";
      echo"<div align=\"center\">Bonjour,<br /><br />Jean - Charles WATTEZ et son équipe vous remercie<br /><br /> de l'intérêt que vous portez à notre établissement. </div>";
	  echo" <br /><br />";
	  echo"<div align=\"center\"><a href=\"index2.php?page=livreor/livre_or.php\";><font color=#0066CC>Pour retourner au livre d'or, <strong>cliquez ici</strong></center></div>";	  
	  echo" <br /><br />";
      echo"</td>\n";
  echo"</tr>\n";
echo"</table>";
echo"<br /><br /><br /><br />";
}
	mysql_close();
}
	
?>
Bref je suis "planté" et sans solution.
Je me noie ...au secours... non je rigole, mais merci d'avance de l'aide.
Patience et obstination sont des qualités !