diff -ruN /tmp/spamplemousse/l10n/fr/main.lang spamplemousse/l10n/fr/main.lang --- /tmp/spamplemousse/l10n/fr/main.lang 2005-12-27 21:08:33.000000000 +0100 +++ spamplemousse/l10n/fr/main.lang 2006-03-10 22:17:07.000000000 +0100 @@ -58,3 +58,5 @@ ;By Par +;Sorry, your messsage is a spam. I don't accept spam. Go away ! +Tu envoyes du spam ? Désolé, je n'accepte pas le spam. diff -ruN /tmp/spamplemousse/l10n/fr-utf8/main.lang spamplemousse/l10n/fr-utf8/main.lang --- /tmp/spamplemousse/l10n/fr-utf8/main.lang 2005-12-27 22:39:45.000000000 +0100 +++ spamplemousse/l10n/fr-utf8/main.lang 2006-03-10 22:17:38.000000000 +0100 @@ -58,3 +58,6 @@ ;By Par +;Sorry, your messsage is a spam. I don't accept spam. Go away ! +Tu envoyes du spam ? Désolé, je n'accepte pas le spam. + diff -ruN /tmp/spamplemousse/lib/class.spamfilter.php spamplemousse/lib/class.spamfilter.php --- /tmp/spamplemousse/lib/class.spamfilter.php 2005-12-26 17:31:54.000000000 +0100 +++ spamplemousse/lib/class.spamfilter.php 2006-03-11 00:13:27.000000000 +0100 @@ -92,18 +92,25 @@ function chk_spamwords($str) { global $con; + $words_score = 0; # récupération de la liste de mots spam + # TODO : donner un poids aux mots-spams (y compris négatif). $req = 'SELECT * FROM '.DB_PREFIX.'spamwords'; $res = $con->select($req); - # on compare les chaines en minuscules (strpos est sensible à la casse) + # on compare les chaines en minuscules (substr_count est sensible à la casse) + # TODO : recherche de mots-clefs spams via une regex ? $str = strtolower($str); while ($res->fetch()) { - if (strpos($str, $res->f('spamwords_word'), 0) !== false) - return true; + $occ = substr_count($str, $res->f('spamwords_word')); + if($occ) { + # TODO formule expérimentale + #echo $res->f('spamwords_word') . " $occ $words_score
"; + $words_score += min(pow(1.2, $occ), 3); + } } - return false; + return $words_score; } /** @@ -143,18 +150,30 @@ */ function is_spam($author, $authorMail, $authorURL, $authorIP, $content) { + # Compter la taille du commentaire + $content_size = strlen($content); + $score = 0; + + # Si petite taille de commentaire, reste aux classiques + if($content_size < 400) { + # test de l'ip sur les rbl + if (rbl_lookup($authorIP) > 0) + return 'RBL'; + + # test de la présence de mots spam + if (spamfilter::chk_spamwords($author.' '.$authorMail.' '.$authorURL.' '.$content)>0) + return 'spamword'; + + return false; + } -//* - # test de l'ip sur les rbl - if (rbl_lookup($authorIP) != '') - return 'RBL'; -//*/ + # Multiplie le nombre de RBL où la chose est listée par 3 + $score += rbl_lookup($authorIP) * 3; - # test de la présence de mots spam - if (spamfilter::chk_spamwords($author.' '.$authorMail.' '.$authorURL.' '.$content)) - return 'spamword'; + # score mots-clefs + $score += spamfilter::chk_spamwords($author.' '.$authorMail.' '.$authorURL.' '.$content) ; - return false; + return $score; } } diff -ruN /tmp/spamplemousse/lib/rbl.php spamplemousse/lib/rbl.php --- /tmp/spamplemousse/lib/rbl.php 2005-12-27 20:27:27.000000000 +0100 +++ spamplemousse/lib/rbl.php 2006-03-11 00:06:09.000000000 +0100 @@ -14,29 +14,46 @@ /* rbl list: an array of RBLs to look in + + TODO Spamplemousse : + 1. rendre cette liste configurable dans l'interface d'admin + 2. permettre de donner un poids aux RBL (celui-ci pouvant être, pourquoi pas, négatif) + + Une liste de RBLs se trouve par ici : http://www.moensted.dk/spam/ */ $rbls = array( 'bl.blbl.org', // blacklist de spam de commentaires 'bl.spamcop.net', // blacklist de spam de mails //'sbl.spamhaus.org', // blacklist de spam de mails (compris dans sbl-xbl.spamhaus.org) //'opm.blitzed.org', // blacklist d'open proxies (compris dans sbl-xbl.spamhaus.org) - 'sbl-xbl.spamhaus.org' // blacklist généraliste : spam, open proxies, exploits + 'sbl-xbl.spamhaus.org', // blacklist généraliste : spam, open proxies, exploits + + // Par pays (oui, c'est raciste & chauvin. De tte façon avec des commentaires + // en Français, vous vous attendiez à quoi ?) + 'cn.countries.nerd.dk', // Chine + 'brazil.blackholes.us', + 'argentina.blackholes.us', + 'korea.blackholes.us', + 'russia.blackholes.us', + + 'sagonet.blackholes.us' // ISP de merde qui m'a que trop cassé les c*uilles ); //this function does the actual lookup; it's here so it can be called externally function rbl_lookup($ip) { global $rbls; + $rbl_score=0; if (preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/', $ip, $matches)) { foreach ($rbls as $rbl) { $rblhost = $matches[4] . '.' . $matches[3] . '.' . $matches[2] . '.' . $matches[1] . '.' . $rbl.'.'; $resolved = gethostbyname($rblhost); if ($resolved != $rblhost) { - return $rbl; + $rbl_score++; } } } - return ''; + return $rbl_score; } diff -ruN /tmp/spamplemousse/postcon.php spamplemousse/postcon.php --- /tmp/spamplemousse/postcon.php 2005-12-27 22:01:45.000000000 +0100 +++ spamplemousse/postcon.php 2006-03-11 02:23:13.000000000 +0100 @@ -23,6 +23,9 @@ # ce script gère le filtrage des commentaires +define(SUSPICIOUS_SCORE, 0); +define(SPAM_SCORE, 8.0); + # on regarde si le plugin est activé $desc = implode('', file(dirname(__FILE__).'/desc.xml')); if (strpos($desc, 'active="true"') || strpos($desc, 'active="1"')) { @@ -47,7 +50,10 @@ $ip = spamfilter::realip(@$_SERVER['REMOTE_ADDR'], @$_SERVER['HTTP_X_FORWARDED_FOR']); # On teste assez tot si c'est du spam, si ce n'en est pas on rend la main au fonctionnement normal $spam = spamfilter::is_spam($nom,$mail,$site, $ip, trim($_POST['c_content'])); - if ($spam !== false) { + if ($spam > SPAM_SCORE) { + $blog->setError(__("Sorry, your messsage is a spam. I don't accept spam. Go away !")); + } + elseif( (is_numeric($spam) && ($spam > SUSPICIOUS_SCORE) ) or (!is_numeric($spam) && ($spam !== false))) { # localisation $__lang = (!empty($lang)) ? $lang : dc_default_lang; if (dc_encoding == 'UTF-8') { @@ -153,8 +159,8 @@ } # avertissement de l'utilisateur, son message est dans la file de modération - if (!empty($_GET['mod'])) { - $form_msg = __('Your comment has been sent '. + if(!empty($_GET['mod'])) { + $form_msg = __('Your comment has been sent '. 'successfully. It will be online soon.'); } }