Mod antispam

Ce forum vous servira à trouver de l'aide uniquement en ce qui concerne le développement d'un de vos MODs, ou l'adaptation d'un MOD phpBB2 pour phpBB3.

Modérateur: Equipe

Mod antispam

Messagepar Matismo » 01 Fév 2010 à 20:09

Salut à tous

Je suis en train de coder quelque chose :

SI l'user a moins de 20 posts,
SI son post contient un lien sortant
ALORS
mettre son post en attente de modération.

Voici ce que j'ai fait :

dans functions_posting.php
AVANT
Code: Tout sélectionner
// Start the transaction here
$db->sql_transaction('begin');


INSERER
Code: Tout sélectionner
/* MOD EMPECHER LES NOUVEAUX MEMBRES DE POSTER DES LIENS SORTANTS
   --------------------------------------------------------------------------------------------------
   Si un mec ayant moins de 20 posts poste un message contenant un lien sortant,
   le post est mis en attente de modération
   -------------------------------------------------------------------------------------------------- */
   $sql_user = "SELECT user_posts FROM phpbb3_users WHERE user_id = ".$user->data['user_id'];
   $result_user = $db->sql_query($sql_user);
    $row_user = $db->sql_fetchrow($result_user);
   $posts_user = $row_user['user_posts'];
         
   
   if ($posts_user < 20) // Si l'auteur a moins de X messages
   {
      // Y'a-t-il un lien dans le message ? le #i est une option qui désensibilise la casse.
      // Fonctionne si le lien est brut
      // Bloque tous les liens bbcodés (même internes, je ne sais pas pourquoi).
      if (preg_match('#href="(.+)"#i', $data['message'] ,$tableau_resultat) || preg_match('#[url=(.+)]#i', $data['message'] ,$tableau_resultat2))
      {    
         if(!empty($tableau_resultat[1])) { $url = $tableau_resultat[1]; }
         elseif (!empty($tableau_resultat2[1])) { $url = $tableau_resultat2[1]; }
         $home_url = "mondomaine.com";
         
         if(strpos($url, $home_url)=== false) // Si oui, regarder si c'est un lien interne
         {    
            // Un lien externe a été trouvé : on le met en attente de modération
            $post_approval = 0;
            // Et on envoie un mail aux modérateurs pour leur dire de checker le panneau d'admin ?            
         }
      }
   }   
   /* FIN DU MOD
   -------------------------------------------------------------------------------------------------- */



Or ça buggue.

Code: Tout sélectionner
if (preg_match('#href="(.+)"#i', $data['message'] ,$tableau_resultat) || preg_match('#[url=(.+)]#i', $data['message'] ,$tableau_resultat2))

=> Quand je fais ça, il met le post en attente de modération s'il contient un [quote] ?!
=> De plus, il le met en attente quand il y'a un lien de la forme [url=... , que ce soit un lien interne, ou un lien sortant.

Je ne comprends pas pourquoi : je pense que mes REGEX sont foireuses.


Voici mes questions :
- quelqu'un pourrait-il m'aider à bétonner mes REGEX pour faire exactement ce que je veux et rien d'autre ?
- comment puis-je optimiser ce code ? Je voudrais notamment me passer de la requête SQL, qui me sert à chopper le nombre de posts du posteur


Merci à ceux qui m'aideront à améliorer ça :)
Matismo
Posteur néophyte
Posteur néophyte
 
Messages: 4
Inscription: 05 Mai 2009 à 17:36

Re: Mod antispam

Messagepar spitfire pat » 02 Fév 2010 à 08:37

  • en ce qui concerne le nombre de posts, tu le récupère par $user->data['user_posts']
  • pour le regex, on va avoir 2 types d'urls à traiter: une adresse rendue cliquable ou le bbcode url
    • l'adresse rendue cliquable: elle se présente sous cette forme:
      <a class="postlink" href="http://viagra.com">http://viagra.com</a>

      et voici le filtre corresondant:
      %<a.+? href="(.+?)">.+?</a>%
    • pour le bbcode url, il faut d'abord récupérer le bbcode_uid:
      Code: Tout sélectionner
      $bbcode_uid = $data['bbcode_uid'];

      voici comment se présente cette adresse:
      [url=http&#58;//viagra&#46;com:9r78tetk]achetez du viagra[/url:9r78tetk]

      et son filtre
      %\\[url=(.+?):' . $bbcode_uid . '].+?\\[/url:' . $bbcode_uid . ']%
Avatar de l’utilisateur
spitfire pat
MOD Contest Winner
MOD Contest Winner
 
Messages: 15310
Inscription: 18 Sep 2004 à 15:43
Localisation: bourgogne

Re: Mod antispam

Messagepar Matismo » 02 Fév 2010 à 09:11

Salut !
Merci pour tes tuyaux, j'aurais mis beaucoup de temps avant de réaliser l'astuce du bbcode_uid :)

En revanche, récupérer le nombre de posts par $user_>data['user_posts'] fut mon premier réflexe.
Or je me suis aperçu que ça ne renvoyait rien (j'ai testé et constaté). D'où ma requête SQL, pour chopper cette valeur.
Saurais-tu pourquoi ?

En tout cas, merci pour les regexp, je vais les tester aujourd'hui, je te tiendrai au courant :)

Bonne journée !
Matismo
Posteur néophyte
Posteur néophyte
 
Messages: 4
Inscription: 05 Mai 2009 à 17:36

Re: Mod antispam

Messagepar spitfire pat » 02 Fév 2010 à 10:20

Matismo a écrit:En revanche, récupérer le nombre de posts par $user_>data['user_posts'] fut mon premier réflexe.
Or je me suis aperçu que ça ne renvoyait rien (j'ai testé et constaté).
tu as sûrement fait une faute de frappe en écrivant le nom de clé 'user_posts' , $user->data contient TOUS les champs de la base users
fais un print_r($user->data); après un lancement de session phpBB et tu verras bien
Avatar de l’utilisateur
spitfire pat
MOD Contest Winner
MOD Contest Winner
 
Messages: 15310
Inscription: 18 Sep 2004 à 15:43
Localisation: bourgogne

Re: Mod antispam

Messagepar Matismo » 03 Fév 2010 à 10:19

Salut,
je viens donner des news.

Tu avais probablement raison au sujet de $user->data['user_posts'] : je le récupère correctement à présent.
Pour les filtres REGEXP,
Code: Tout sélectionner
$bbcode_uid = $data['bbcode_uid'];
      if (preg_match('#<a.+? href="(.+?)">.+?</a>#i', $data['message'] ,$tableau_resultat) || preg_match('%\\[url=(.+?):' . $bbcode_uid . '].+?\\[/url:' . $bbcode_uid . ']%', $data['message'] ,$tableau_resultat2) )
      {    
         if(!empty($tableau_resultat[1])) { $url = $tableau_resultat[1]; }
         if (!empty($tableau_resultat2[1])) { $url = $tableau_resultat2[1]; }
         $home_url = "monsite.com";
         
         if(strpos($url, $home_url)=== false) // Si oui, regarder si c'est un lien interne
         {    
            // Un lien externe a été trouvé : on le met en attente de modération
            $post_approval = 0;
         }
      }


"http://www.google.com" va être bloqué (SUCCES)
"http://www.monsite.com" n'est pas bloqué (SUCCES)
"lien externe dans un bbcode" bloqué (SUCCES)
"lien interne dans un bbcode" (bbcode) bloqué (ECHEC)
La présence d'un quote dans le post ne provoque plus sa mise en attente. (SUCCES)

Il me reste donc à déterminer pourquoi, lorsque le lien est dans un bbcode, mon script n'est pas capable de déterminer s'il s'agit d'un lien interne ou sortant.

* j'ai d'autres questions mineures : les "%" sont-ils des délimiteurs ? Sont-ils équivalents aux # que j'utilisais ? Et pourquoi le \\ dans \\[url ? Un seul \ ne suffirait-il pas à échapper le crochet ?


Merci pour votre aide :)
Matismo
Posteur néophyte
Posteur néophyte
 
Messages: 4
Inscription: 05 Mai 2009 à 17:36

Re: Mod antispam

Messagepar spitfire pat » 03 Fév 2010 à 14:36

je pense que tu devrais séparer tes deux preg_match au lieu de les associer dans une même condition
dans l'expression if($a || $b) $b ne sera pas même testé si $b est vrai car le résultat sera vrai quelque soit la valeur de $b, c'est ce qui a dû se passer avec ton if(preg_match(...) || preg_match(...))

les "%" sont-ils des délimiteurs ? Sont-ils équivalents aux # que j'utilisais ?

en fait n'importe quel caractère non alphanumérique peut être utilisé comme délimiteur à l'exception des antislashes \
pourquoi le \\ dans \\[url ? Un seul \ ne suffirait-il pas à échapper le crochet ?

c'est dans le regex qu'il y a besoin d'échapper le crochet, il a besoin donc que la chaine contienne \[, ce qui oblige en php a échapper l' antislash
(mais en fait ce n'est probablement plus nécessaire avec les récentes versions de php, si tu fais echo "\["; ou echo "\\["; , ça revient au même
Avatar de l’utilisateur
spitfire pat
MOD Contest Winner
MOD Contest Winner
 
Messages: 15310
Inscription: 18 Sep 2004 à 15:43
Localisation: bourgogne


Retourner vers Aide au développement

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

Partenaires : phpBBHacks.com • phpBB-Seo.com • EzCom-fr.com • phpBB3 Styles • phpBB podpora • phpBB Portugal    Liens : Net Avenir • PromoBenef • Ticket Gagnant