/**
 * 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;
}
Exemplo n.º 2
0
/**
 * 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;
}