source: spip-zone/_plugins_/nospam/nospam_pipelines.php @ 65564

Last change on this file since 65564 was 65564, checked in by cedric@…, 7 years ago

oups, on avait perdu les appels a verifier specifiques a nospam depuis le refactoring du code

File size: 7.0 KB
Line 
1<?php
2/**
3 * Plugin No-SPAM
4 * (c) 2008-2011 Cedric Morin Yterium.net
5 * Licence GPL
6 *
7 */
8
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11/**
12 * Lister les formulaires a prendre en charge contre le SPAM
13 * pour verifier le nobot et le jeton sur un formulaire, l'ajouter a cette liste
14 * par le pipeline nospam_lister_formulaires
15 * @return void
16 */
17function nospam_lister_formulaires(){
18        if (!isset($GLOBALS['formulaires_no_spam']))
19                $GLOBALS['formulaires_no_spam'] = array();
20        $formulaires = array_merge($GLOBALS['formulaires_no_spam'],array('forum','ecrire_auteur','signature'));
21        return pipeline('nospam_lister_formulaires',$formulaires);
22}
23
24/**
25 * Ajouter le champ de formulaire 'nobot' au besoin
26 *
27 * @param array $flux
28 * @return array
29 */
30function nospam_recuperer_fond($flux){
31        // determiner le nom du formulaire
32        $fond = strval($flux['args']['fond']);
33        if (false !== $pos = strpos($fond, 'formulaires/')) {
34                $form = substr($fond, $pos + 12);
35                if (in_array($form, nospam_lister_formulaires())){
36                        // on ajoute le champ 'nobot' si pas present dans le formulaire
37                        $texte = &$flux['data']['texte'];
38                        if ((false === strpos($texte, 'name="nobot"'))
39                        and (false !== $pos = strpos($texte, '</form>'))) {
40                                $nobot = recuperer_fond("inclure/nobot", array('nobot'=>''));
41                                $texte = substr_replace($texte, $nobot, $pos, 0);
42                        }
43                }
44        }
45        return $flux;
46}
47
48/**
49 * Ajouter un jeton temporaire lie a l'heure et a l'IP pour limiter la reutilisation possible du formulaire
50 *
51 * @param array $flux
52 * @return array
53 */
54function nospam_formulaire_charger($flux){
55        $form = $flux['args']['form'];
56        if (in_array($form, nospam_lister_formulaires())
57          AND $flux['data']
58          AND is_array($flux['data'])){
59                include_spip("inc/nospam");
60                $jeton = creer_jeton($form);
61                $flux['data']['_hidden'] .= "<input type='hidden' name='_jeton' value='$jeton' />";
62        }
63        return $flux;
64}
65
66/**
67 * Verifier le jeton temporaire lie a l'heure et a l'IP pour limiter la reutilisation possible du formulaire
68 *
69 * @param array $flux
70 * @return array
71 */
72function nospam_formulaire_verifier($flux){
73        $form = $flux['args']['form'];
74        if (in_array($form, nospam_lister_formulaires())){
75                include_spip("inc/nospam");
76                $jeton = _request('_jeton');
77                // le jeton prend en compte l'heure et l'ip de l'internaute
78                if (_request('nobot') // trop facile !
79                OR (!verifier_jeton($jeton, $form))){
80                        #spip_log('pas de jeton pour '.var_export($flux,true),'nospam');
81                        $flux['data']['message_erreur'] .= _T('nospam:erreur_jeton');
82                        if ($form=='forum')
83                                unset($flux['data']['previsu']);
84                }
85
86                // pas la peine de filtrer les contenus postés par un admin
87                if ($GLOBALS['visiteur_session']['statut'] != '0minirezo'){
88                        if ($verifier_formulaire = charger_fonction("verifier_formulaire_$form","nospam",true)){
89                                $flux = $verifier_formulaire($flux);
90                        }
91                }
92        }
93        return $flux;
94}
95
96/**
97 * Au moment de decider du statut d'un forum,
98 * quelques verifications et une moderation si necessaire !
99 *
100 * @param array $flux
101 * @return array
102 */
103function nospam_pre_edition($flux){
104        if ($flux['args']['table']=='spip_forum'
105          AND $flux['args']['action']=='instituer'){
106         
107          // ne pas publier automatiquement certains messages suspects ...
108                // sauf si le posteur a de toute facon le pouvoir de moderer et de se publier
109                include_spip('inc/autoriser');
110          if ($flux['data']['statut'] == 'publie'
111          AND (!isset($GLOBALS['visiteur_session']['id_auteur']) OR !autoriser('modererforum'))){
112
113                        $email = strlen($flux['data']['email_auteur']) ? " OR email_auteur=".sql_quote($flux['data']['email_auteur']):"";
114                        $spammeur_connu = (!isset($GLOBALS['visiteur_session']['statut']) AND (sql_countsel('spip_forum','(ip='.sql_quote($GLOBALS['ip'])."$email) AND statut='spam'")>0));
115
116                        // si c'est un spammeur connu,
117                        // verifier que cette ip n'en est pas a son N-ieme spam en peu de temps
118                        // a partir d'un moment on refuse carrement le spam massif
119                        if ($spammeur_connu){
120                                // plus de 10 spams dans les dernieres 2h, faut se calmer ...
121                                // ou plus de 30 spams dans la dernieres 1h, faut se calmer ...
122                                if (
123                                        ($nb=sql_countsel('spip_forum','statut=\'spam\' AND (ip='.sql_quote($GLOBALS['ip']).$email.') AND maj>DATE_SUB(NOW(),INTERVAL 120 minute)'))>10
124                                        OR
125                                        ($nb=sql_countsel('spip_forum','statut=\'spam\' AND (ip='.sql_quote($GLOBALS['ip']).$email.') AND maj>DATE_SUB(NOW(),INTERVAL 60 minute)'))>30
126                                        ){
127                                        $flux['data']['statut']=''; // on n'en veut pas !
128                                        spip_log("[Refuse] $nb spam pour (ip=".$GLOBALS['ip']."$email) dans les 2 dernieres heures",'nospam');
129                                        return $flux;
130                                }
131                        }
132
133                        // si c'est un message bourre de liens, on le modere
134                        // le seuil varie selon le champ et le fait que le spammeur est deja connu ou non
135                        $seuils = array(
136                                // seuils par defaut
137                                0=>array(
138                                        0=>array(1=>'prop',3=>'spam'), // seuils par defaut
139                                        'url_site' => array(2=>'spam'), // 2 liens dans le champ url, c'est vraiment louche
140                                        'texte'=>array(4=>'prop',20=>'spam') // pour le champ texte
141                                ),
142                                // seuils severises pour les spammeurs connus
143                                'spammeur'=>array(
144                                        0=>array(1=>'spam'),
145                                        'url_site' => array(2=>'spam'), // 2 liens dans le champ url, c'est vraiment louche
146                                        'texte'=>array(1=>'prop',5=>'spam')
147                                )
148                        );
149
150                        $seuils = $spammeur_connu?$seuils['spammeur']:$seuils[0];
151                        include_spip("inc/nospam"); // pour analyser_spams()
152                        foreach($flux['data'] as $champ=>$valeur) {
153                                $infos = analyser_spams($valeur);
154                                if ($infos['contenu_cache']) {
155                                        // s'il y a du contenu caché avec des styles => spam direct
156                                        $flux['data']['statut'] = 'spam';
157                                }elseif ($infos['nombre_liens'] > 0) {
158                                        // si un lien a un titre de moins de 3 caracteres, c'est louche...
159                                        if ($infos['caracteres_texte_lien_min'] < 3) {
160                                                $flux['data']['statut'] = 'prop'; // en dur en attendant une idee plus generique
161                                        }
162                                       
163                                        if (isset($seuils[$champ]))
164                                                $seuil = $seuils[$champ];
165                                        else
166                                                $seuil = $seuils[0];
167
168                                        foreach($seuil as $s=>$stat)
169                                                if ($infos['nombre_liens'] >= $s){
170                                                        $flux['data']['statut'] = $stat;
171                                                        spip_log("\t".$flux['data']['auteur']."\t".$GLOBALS['ip']."\t"."requalifié en ".$stat." car nombre_liens >= ". $s,'nospam');
172                                                }       
173                                }
174                        }
175
176                        // verifier qu'un message identique n'a pas ete publie il y a peu
177                        if ($flux['data']['statut'] != 'spam'){
178                                if (sql_countsel('spip_forum','texte='.sql_quote($flux['data']['texte'])." AND statut IN ('publie','off','spam')")>0)
179                                        $flux['data']['statut']='spam';
180                        }
181                        // verifier que cette ip n'en est pas a son N-ieme post en peu de temps
182                        // plus de 5 messages en 5 minutes c'est suspect ...
183                        if ($flux['data']['statut'] != 'spam'){
184                                if (($nb=sql_countsel('spip_forum','ip='.sql_quote($GLOBALS['ip']).' AND maj>DATE_SUB(NOW(),INTERVAL 5 minute)'))>5)
185                                        $flux['data']['statut']='spam';
186                                #spip_log("$nb post pour l'ip ".$GLOBALS['ip']." dans les 5 dernieres minutes",'nospam');
187                        }
188          }
189        }
190        return $flux;
191}
192
193
194?>
Note: See TracBrowser for help on using the repository browser.