/** * Verification supplementaire antispam sur le formulaire_ecrire_auteur * * @param array $flux * @return array */ function nospam_verifier_formulaire_ecrire_auteur_dist($flux) { $form = $flux['args']['form']; if (!isset($flux['data']['texte_message_auteur'])) { include_spip("inc/nospam"); include_spip("inc/texte"); // regarder si il y a du contenu en dehors des liens ! $texte_message_auteur = _request('texte_message_auteur'); $caracteres = compter_caracteres_utiles($texte_message_auteur); if ($caracteres < 10) { $flux['data']['texte_message_auteur'] = _T('forum_attention_dix_caracteres'); unset($flux['data']['previsu']); } // on analyse le sujet $infos_sujet = analyser_spams(_request('sujet_message_auteur')); // si un lien dans le sujet = spam ! if ($infos_sujet['nombre_liens'] > 0) { $flux['data']['sujet_message_auteur'] = _T('nospam:erreur_spam'); unset($flux['data']['previsu']); } // on analyse le texte $infos_texte = analyser_spams($texte_message_auteur); if ($infos_texte['nombre_liens'] > 0) { // si un lien a un titre de moins de 3 caracteres = spam ! if ($infos_texte['caracteres_texte_lien_min'] < 3) { $flux['data']['texte_message_auteur'] = _T('nospam:erreur_spam'); } // si le texte contient plus de trois liens = spam ! if ($infos_texte['nombre_liens'] >= 3) { $flux['data']['texte_message_auteur'] = _T('nospam:erreur_spam'); } } } return $flux; }
/** * Retourne un tableau d'analyse du texte transmis * Cette analyse concerne principalement des statistiques sur les liens * * @param string $texte texte d'entree * @return array rapport d'analyse */ function analyser_spams($texte) { $infos = array('caracteres_utiles' => 0, 'nombre_liens' => 0, 'caracteres_texte_lien_min' => 0); if (!$texte) { return $infos; } // on travaille d'abord sur le texte 'brut' tel que saisi par // l'utilisateur pour ne pas avoir les class= et style= que spip ajoute // sur les raccourcis. // on ne tient pas compte des blocs <code> et <cadre> ni de leurs contenus include_spip("inc/texte_mini"); if (!function_exists('echappe_html')) { // SPIP 2.x include_spip("inc/texte"); } $texte_humain = echappe_html($texte); // on repère dans ce qui reste la présence de style= ou class= qui peuvent // servir à masquer du contenu // les spammeurs utilisent le laxisme des navigateurs pour envoyer aussi style = // soyons donc mefiant // (mais en enlevant le base64 !) $texte_humain = str_replace('class="base64"', '', $texte_humain); $hidden = ",(<(img|object)|\\s(?:style|class)\\s*=[^>]+>),UimsS"; if (preg_match($hidden, $texte_humain)) { // suspicion de spam $infos['contenu_cache'] = true; } include_spip('inc/texte'); $texte = propre($texte); // caracteres_utiles $infos['caracteres_utiles'] = compter_caracteres_utiles($texte, false); // nombre de liens $liens = array_filter(extraire_balises($texte, 'a'), 'pas_lien_ancre'); $infos['nombre_liens'] = count($liens); $infos['liens'] = $liens; // taille du titre de lien minimum if (count($liens)) { // supprimer_tags() s'applique a tout le tableau, // mais attention a verifier dans le temps que ca continue a fonctionner # $titres_liens = array_map('supprimer_tags', $liens); $titres_liens = supprimer_tags($liens); $titres_liens = array_map('strlen', $titres_liens); $infos['caracteres_texte_lien_min'] = min($titres_liens); } return $infos; }
/** * Verification supplementaire antispam sur le formulaire_forum * * @param array $flux * @return array */ function nospam_verifier_formulaire_forum_dist($flux) { $form = $flux['args']['form']; if (!isset($flux['data']['texte']) and $GLOBALS['meta']['forums_texte'] == 'oui') { $texte = _request('texte'); include_spip("inc/nospam"); // regarder si il y a du contenu en dehors des liens ! $caracteres = compter_caracteres_utiles($texte); $min_length = defined('_FORUM_LONGUEUR_MINI') ? _FORUM_LONGUEUR_MINI : 10; if ($caracteres < $min_length) { $flux['data']['texte'] = _T('forum_attention_dix_caracteres'); } // regarder si il y a du contenu cache if (!isset($flux['data']['texte'])) { $infos = analyser_spams($texte); if (isset($infos['contenu_cache']) and $infos['contenu_cache']) { $flux['data']['texte'] = _T('nospam:erreur_attributs_html_interdits'); } } // regarder si il y a des liens deja references par des spammeurs if (!isset($flux['data']['texte']) and isset($infos['liens']) and count($infos['liens'])) { if ($h = rechercher_presence_liens_spammes($infos['liens'], _SPAM_URL_MAX_OCCURENCES, 'spip_forum', array('texte'))) { spip_log("Refus message de forum qui contient un lien vers {$h}", "nospam"); $flux['data']['texte'] = _T('nospam:erreur_url_deja_spammee'); } } // on prend en compte la checkbox de confirmation // si le flag en session est bien leve if (_request('notabuse')) { session_start(); if ($_SESSION['notabuse_check']) { unset($_SESSION['notabuse_check']); $_SESSION['notabuse_checked'] = true; // on leve une globale pour la fin de ce hit, a toute fin utile (puisque plus rien en $_SESSION) $GLOBALS['notabuse_checked'] = true; } } if (!count($flux['data'])) { if (nospam_check_ip_status($GLOBALS['ip']) !== 'ok') { session_start(); if ($_SESSION['notabuse_checked']) { // ok on retire de la session le check qui ne sert qu'une fois unset($_SESSION['notabuse_checked']); // et on laisse passer } else { $flux['data']['texte'] = _T('nospam:info_ip_suspecte') . "<br />\n\t\t\t\t\t<span class='choix'>\n\t\t\t\t\t<input type='checkbox' name='notabuse' value='1' id='notabuse'/> <label for='notabuse'>" . _T('nospam:label_message_licite') . "</label>\n\t\t\t\t\t</span>"; $_SESSION['notabuse_check'] = true; spip_log("notabuse_check sur IP " . $GLOBALS['ip'], "nospam"); } } } // si il y a une erreur, pas de previsu, on reste bloque a la premiere etape if (isset($flux['data']['texte'])) { unset($flux['data']['previsu']); } elseif (!count($flux['data'])) { $now = $_SERVER['REQUEST_TIME']; // calculer la "popularite" des POST forums et forums avec liens if (!isset($GLOBALS['meta']['nospam_pop_forum_post'])) { $GLOBALS['meta']['nospam_pop_forum_post'] = 0; } if (!isset($GLOBALS['meta']['nospam_pop_forum_postwlink'])) { $GLOBALS['meta']['nospam_pop_forum_postwlink'] = 0; } if (!isset($GLOBALS['meta']['nospam_pop_date'])) { $GLOBALS['meta']['nospam_pop_date'] = date('Y-m-d H:i:s', $now); } $duree = max($now - strtotime($GLOBALS['meta']['nospam_pop_date']), 1); list($a, $b) = nospam_popularite_constantes($duree); spip_log("Pop forum : {$duree}, {$a}, {$b}", "nospam"); // decrementer if ($duree > 1800) { $GLOBALS['meta']['nospam_pop_date'] = date('Y-m-d H:i:s', $now); $GLOBALS['meta']['nospam_pop_forum_post'] = round(floatval($GLOBALS['meta']['nospam_pop_forum_post']) * $a, 2); $GLOBALS['meta']['nospam_pop_forum_postwlink'] = round(floatval($GLOBALS['meta']['nospam_pop_forum_postwlink']) * $a, 2); spip_log("Pop Decremente : " . $GLOBALS['meta']['nospam_pop_forum_post'] . ", " . $GLOBALS['meta']['nospam_pop_forum_postwlink'], "nospam"); } // incrementer $GLOBALS['meta']['nospam_pop_forum_post'] = round(floatval($GLOBALS['meta']['nospam_pop_forum_post']) + $b, 2); if (isset($infos['liens']) and count($infos['liens'])) { $GLOBALS['meta']['nospam_pop_forum_postwlink'] = round(floatval($GLOBALS['meta']['nospam_pop_forum_postwlink']) + $b, 2); } ecrire_meta("nospam_pop_forum_post", $GLOBALS['meta']['nospam_pop_forum_post']); ecrire_meta("nospam_pop_forum_postwlink", $GLOBALS['meta']['nospam_pop_forum_postwlink']); ecrire_meta("nospam_pop_date", $GLOBALS['meta']['nospam_pop_date']); spip_log("Pop Incremente : " . $GLOBALS['meta']['nospam_pop_forum_post'] . ", " . $GLOBALS['meta']['nospam_pop_forum_postwlink'], "nospam"); } } return $flux; }