source: spip-zone/_plugins_/nospam/inc/nospam.php @ 65561

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

PHPDoc

File size: 5.3 KB
Line 
1<?php
2/**
3 * Plugin No-SPAM
4 * (c) 2008 Cedric Morin Yterium.net
5 * Licence GPL
6 *
7 */
8
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11function nospam_hash_env() {
12        static $res ='';
13        if ($res) return $res;
14        $ip = explode('.',$GLOBALS['ip']);
15        array_pop($ip);
16        $ip = implode('.',$ip).".xxx";
17        $res = md5($ip. $_SERVER['HTTP_USER_AGENT']);
18        #spip_log("jeton $res pour ".$ip. $_SERVER['HTTP_USER_AGENT'],"jetons");
19        return $res;
20}
21
22
23/**
24 * Calcule une cle de jeton pour un formulaire
25 *
26 * @param string $form
27 *   nom du formulaire
28 * @param string $qui
29 *   identifiant du visiteur a qui est attribue le jeton
30 * @return string
31 *   cle calculee
32 */
33function creer_jeton($form, $qui=NULL) {
34        $time = date('Y-m-d-H');
35        if (is_null($qui)){
36                if (isset($GLOBALS['visiteur_session']['id_auteur']) AND intval($GLOBALS['visiteur_session']['id_auteur']))
37                        $qui = ":".$GLOBALS['visiteur_session']['id_auteur'].":".$GLOBALS['visiteur_session']['nom'];
38                elseif (!defined('_IS_BOT') OR !_IS_BOT) { // pas de jeton pour les bots qui n'ont rien d'interessant a poster
39                        $qui = nospam_hash_env();
40                }
41        }
42        include_spip('inc/securiser_action');
43        // le jeton prend en compte l'heure et l'identite de l'internaute
44        return calculer_cle_action("jeton$form$time$qui");
45}
46
47/**
48 * Verifie une cle de jeton pour un formulaire
49 *
50 * @param string $form nom du formulaire
51 * @param string cle recue
52 * @return bool cle correcte ?
53 */
54function verifier_jeton($jeton, $form, $qui=NULL) {
55        $time = time();
56        $time_old = date('Y-m-d-H',$time-3600);
57        $time = date('Y-m-d-H',$time);
58
59        if (is_null($qui)){
60                if (isset($GLOBALS['visiteur_session']['id_auteur']) AND intval($GLOBALS['visiteur_session']['id_auteur']))
61                        $qui = ":".$GLOBALS['visiteur_session']['id_auteur'].":".$GLOBALS['visiteur_session']['nom'];
62                else {
63                        $qui = nospam_hash_env();
64                }
65        }
66       
67        $ok = (verifier_cle_action("jeton$form$time$qui",$jeton)
68                        or verifier_cle_action("jeton$form$time_old$qui",$jeton));
69        #if (!$ok)
70        #       spip_log("Erreur form:$form qui:$qui agent:".$_SERVER['HTTP_USER_AGENT']." ip:".$GLOBALS['ip'],'fauxjeton');
71        return $ok;
72}
73
74
75/**
76 * Compte le nombre de caracteres d'une chaine,
77 * mais en supprimant tous les liens
78 * (qu'ils soient ou non ecrits en raccourcis SPIP)
79 * ainsi que tous les espaces en trop
80 *
81 * @param string $texte
82 *   texte d'entree
83 * @param bool $propre
84 *   passer le texte dans propre ou non
85 * @return int
86 *   compte du texte nettoye
87 */
88function compter_caracteres_utiles($texte, $propre=true) {
89        include_spip('inc/charsets');
90        if ($propre) $texte = propre($texte);
91        $u = $GLOBALS['meta']['pcre_u'];
92        // regarder si il y a du contenu en dehors des liens !
93        $texte = PtoBR($texte);
94        $texte = preg_replace(",<a.*</a>,{$u}Uims",'',$texte);
95        // \W matche tous les caracteres non ascii apres 0x80
96        // et vide donc les chaines constitues de caracteres unicodes uniquement
97        // on remplace par un match qui elimine uniquement
98        // les non \w  et les non unicodes
99        $texte = trim(preg_replace(",[^\w\x80-\xFF]+,ims",' ',$texte));
100
101        // on utilise spip_strlen pour compter la longueur correcte
102        // pour les chaines unicodes
103        return spip_strlen($texte);
104}
105
106
107/**
108 * Retourne un tableau d'analyse du texte transmis
109 * Cette analyse concerne principalement des statistiques sur les liens
110 *
111 * @param string $texte texte d'entree
112 * @return array rapport d'analyse
113 */
114function analyser_spams($texte) {
115        $infos = array(
116                'caracteres_utiles' => 0, // nombre de caracteres sans les liens
117                'nombre_liens' => 0, // nombre de liens
118                'caracteres_texte_lien_min' => 0, // nombre de caracteres du plus petit titre de lien
119        );
120
121        if (!$texte) return $infos;
122
123        // on travaille d'abord sur le texte 'brut' tel que saisi par
124        // l'utilisateur pour ne pas avoir les class= et style= que spip ajoute
125        // sur les raccourcis.
126       
127        // on ne tient pas compte des blocs <code> et <cadre> ni de leurs contenus
128        include_spip("inc/texte_mini");
129        if (!function_exists('echappe_html')) // SPIP 2.x
130                include_spip("inc/texte");
131        $texte_humain = echappe_html($texte);
132        // on repère dans ce qui reste la présence de style= ou class= qui peuvent
133        // servir à masquer du contenu
134        $hidden = ",\s(?:style|class)=[^>]+>,UimsS";
135        if (preg_match($hidden,$texte_humain)) {
136                // suspicion de spam
137                $infos['contenu_cache'] = true;
138        }
139
140        include_spip('inc/texte');
141        $texte = propre($texte);
142
143        // caracteres_utiles
144        $infos['caracteres_utiles'] = compter_caracteres_utiles($texte, false);
145
146        // nombre de liens
147        $liens = array_filter(extraire_balises($texte,'a'),'pas_lien_ancre');
148        $infos['nombre_liens'] = count($liens);
149        $infos['liens'] = $liens;
150
151        // taille du titre de lien minimum
152        if (count($liens)) {
153                // supprimer_tags() s'applique a tout le tableau,
154                // mais attention a verifier dans le temps que ca continue a fonctionner
155                # $titres_liens = array_map('supprimer_tags', $liens);
156                $titres_liens = supprimer_tags($liens);
157                $titres_liens = array_map('strlen', $titres_liens);
158                $infos['caracteres_texte_lien_min'] = min($titres_liens);
159        }
160        return $infos;
161}
162
163/**
164 * Vérifier si un lien est *n'est pas* une ancre : dans ce cas, ne pas le compte (ici, fonction de filtre de tableau)
165 * Cette analyse concerne principalement des statistiques sur les liens
166 *
167 * @param string $texte lien
168 * @return boolean : true ->
169 */
170function pas_lien_ancre($texte){
171        return substr(extraire_attribut($texte,'href'),0,1) == '#' ? false : true;
172               
173}
174
175?>
Note: See TracBrowser for help on using the repository browser.