3 // anti-spam un peu brutal :
4 // 1. une liste de mots interdits est consultee
5 // 2. si le mot existe dans un des textes d'un formulaire, on avertit !
7 // cette fonction appelee automatiquement a chaque affichage de la page privee du Couteau Suisse renvoie un tableau
8 function spam_installe_dist() {
9 // tableau des mots interdits
11 // des liens en dur ou simili...
12 array('<a href=', '</a>', '[url=', '[/url]', '[link=', '[/link]',),
13 // des regexpr ou ips (sans delimiteurs)
14 array(), array(), array()
16 // repere les mots entiers entre parentheses, les regexpr entre slashes et les caracteres unicodes
17 $spam_mots = defined('_spam_MOTS')?
spam_liste_mots(_spam_MOTS
):array();
18 foreach($spam_mots as $v) {
19 if(preg_match(',^\((.+)\)$,', $v, $reg))
20 $t[1][] = '\b'.preg_quote($reg[1], '/').'\b';
21 elseif(preg_match(',^\/(&#)?(.*?)(;?)\/$,', $v, $reg))
22 $t[($reg[2] && $reg[3])?
2:1][]=$reg[2];
25 $t[1] = count($t[1])?
'/'.join('|',$t[1]).'/i':'';
26 $t[2] = count($t[2])?
'/&#(?:'.join('|',$t[2]).');/i':'';
27 $spam_mots = defined('_spam_IPS')?
spam_liste_mots(_spam_IPS
):array();
28 array_walk($spam_mots, 'spam_walk');
29 $t[3] = count($spam_mots)?
'/^(?:' . join('|', $spam_mots) . ')$/':'';
33 function spam_walk(&$item) {
34 $item = preg_replace(',[^\d\.\*\?\[\]\-],', '', $item);
35 if(preg_match(',^\/(.+)\/$,', $item, $reg))
36 $item = '('.$reg[1].')';
37 else $item = str_replace(array('\*','\?','\[','\]','\-'), array('\d+','\d','[',']','-'), preg_quote($item, '/'));
40 // retourne un tableau de mots ou d'expressions a partir d'un texte
41 function spam_liste_mots($texte) {
42 include_spip('inc/filtres');
43 $texte = filtrer_entites(trim($texte));
44 $split = explode('"', $texte);
47 for($i=0; $i<$c; $i++
) if (($s = trim($split[$i])) != ""){
48 if (($i & 1) && ($i != $c-1)) {
49 // on touche pas au texte entre deux ""
52 // on rassemble tous les separateurs : \s\t\n
53 $temp = preg_replace("/[\s\t\n\r]+/", "\t", $s);
54 $temp = str_replace("+"," ", $temp);
55 $split2 = array_merge($split2, explode("\t", $temp));
58 return array_unique($split2);