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

Last change on this file since 43661 was 43661, checked in by booz@…, 10 years ago

on logue ce qu'on fait, avec des tabs pour pouvoir boucle dater à l'occasion

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