Page 1 sur 1

L'anti-spam fastoche

Posté : 29 mars 2008, 22:46
par Gofromiel
On veut être web2.0, on veut de l'interaction, du commentaire, de la réponse et paf on se ramasse 150 messages vantant les mérites du Viagra ou je ne sais quel autre médicament faisant la fortune de laboratoires américains. Pourtant on ne veut pas utiliser de CAPTCHAs parce que ce n'est pas terrible niveau accessibilité, les formules mathématiques semble séduisantes mais pas merveilleuses, et les webservices comme Akismet trop lourds…

Après avoir lu un article fort intéressant sur le blog du Snook j'ai écris une fonction assez simple et qui ce révéle particulièrement efficace. Comme je suis drôlement sympa, je la partage avec vous.

En savoir plus...
<?php

function wd_spamScore($body, $url, $author, $words=NULL, $starters=NULL)
{
    #
    # score >= 1 - The message doesn't look like spam
    # score == 0 - The message should be put to moderation
    # score < -10 - The message is most certainly spam
    #
    
    $score = 0;
    
    #
    # put our body in lower case for checking
    #
    
    $body = strtolower($body);
    
    #
    # how many links are in the body ?
    #
    
	$n = max
	(
		array
		(
			substr_count($body, 'http://'),
			substr_count($body, 'href'),
			substr_count($body, 'ftp')
		)
	);

    if ($n > 2)
    {
        #
        # more than 2 : -1 point per link
        #
    
        $score -= $n;
    }
    else
    {
        #
        # less than 2 : +2 points
        #
        
        $score += 2;
    }
 
	#
	# now remove links
	#
		
	# html style: <a> <a/>
		
	$body = preg_replace('#\<a\s.+\<\/a\>#', '', $body);

	# bb style: [url] [/url]
				
	$body = preg_replace('#\[url.+\/url\]#', '', $body);
		
    # remaining addresses: http://
		
    $body = preg_replace('#http://[^\s]+#', '', $body);

    #
    # how long is the body ?
    #
    
    $l = strlen($body);
    
    if ($l > 20 && $n = 0)
    {
        #
        # More than 20 characters and there's no links : +2 points
        #
        
        $score += 2;
    }
    else if ($l < 20)
    {
        #
        # Less than 20 characters : -1 point
        #
        
        $score--;
    }
    
    #
    # Keyword search
    #
    
    if (empty($words))
    {
        $words = array();
    }
    
    $words += array
    (
        'levitra', 'viagra', 'casino', 'free sex', 'porn'
    );
    
    foreach ($words as $word)
    {
        $n = substr_count($body, $word);
        
        if (!$n)
        {
            continue;
        }
        
        $score -= $n;
    }
    
    #
    # URL length
    #
    
    if (strlen($url) > 32)
    {
        $score--;
    }
    
    #
    # Body starts with...
    #
    
    if (empty($starters))
    {
        $starters = array();
    }
    
    $starters += array
    (
        'interesting', 'sorry', 'nice', 'cool', 'hi'
    );
    
    foreach ($starters as $word)
    {
        $pos = strpos($body, $word . ' ');
        
        if ($pos === false)
        {
            continue;
        }
        
        if ($pos > 10)
        {
            continue;
        }
    
        $score -= 10;
            
        break;
    }
    
    #
    # Author's name has 'http://' in it
    #
    
    if (strpos($author, 'http://'))
    {
        $score -= 2;
    }
    
    #
    # How many different words are used ?
    #
    
    $count = str_word_count($body);
    
    if ($count < 10)
    {
        $score -= 5;
    }
        
    return $score;
}

?>

Posté : 30 mars 2008, 03:17
par Victor BRITO
La liste des mots-clés recherchés devrait être, hélas ! allongée considérablement. Bref, un travail de titan qu'effectue déjà chongqed.org (la liste des spammeurs dressée par ce site, accompagnée des mots-clés employés, est très longue, comme en témoigne cette liste noire prête à l'emploi pour des expressions rationnelles).

Posté : 30 mars 2008, 11:14
par Hywan

Posté : 30 mars 2008, 12:25
par albat
# score >= 1 - The message doesn't look like spam
# score == 0 - The message should be put to moderation
# score < 10 - The message is most certainly spam 
Ce ne serait pas plutôt :
# score > 0 - The message doesn't look like spam
# score == 0 - The message should be put to moderation
# score < 0 - The message is most certainly spam 
Parce que si, score = 4, c'est à la fois un non spam et un spam. :shock:

En informatique quantique, peut-être... :roll: ;)

Posté : 30 mars 2008, 12:40
par Gofromiel
Effectivement choups, c'est n'est pas '10', mais '-10'.

@Victor BRITO: Les mots clés c'est la cerise sur les lasagnes. Les points se sont déjà bien envolés avant d'en arriver là. Ce sont le nombre d'URL et le nombre de mots qui sont les plus important.

@HyWan: Comme quoi on est tous capables de taper "blog comment spam blocker" dans Google :-D Remarque je n'ai jamais eu confiance dans les formules mathématiques : qu'est ce qui empêche le robot de récupérer la chaine et de faire un chti eval() ?

On peut faire un concours de scores. Un message posté par un mystérieux 'idoroMigOdort', commençant pas 'Hi' (-5 points), a marqué -83 !

Posté : 30 mars 2008, 21:39
par Victor BRITO
On peut faire un concours de scores. Un message posté par un mystérieux 'idoroMigOdort', commençant pas 'Hi' (-5 points), a marqué -83 !
En revanche, si je poste le simple texte suivant (même sans lien, ou un seul) :
Buy Tramadol
je passe (puisque tu n'as pas inclus, apparemment, le mot Tramadol). :P

Posté : 31 mars 2008, 21:03
par Gofromiel
Raaa, si tu avais essayé la fonction tu aurais vu que ton message obtient le score faible mais suffisant de -4, soit un aller simple à la poubelle. Vous ne passez pas par la case départ et vous ne touchez pas 3000€

Posté : 31 mars 2008, 21:58
par Victor BRITO
Au temps pour moi. ;)

Et avec un :
Buy one Tramadol box, get two for a very interesting price.
avec un seul lien ?

Est-ce que ça passe ? :langue:

Posté : 01 avr. 2008, 16:59
par Gofromiel
Hou qu'il est vilain ! C'est ça le spam humain :-D Et c'est pas une CAPTCHA qui va l'arrêter non plus.

PS: Tu peux prendre la fonction pour ce qu'elle est: un moyen simple, rapide et non couteux d'éliminer la plupart du spam. Ce n'est pas la solution ultime pour sauver le monde des vilains robots du web.

Posté : 01 avr. 2008, 21:54
par Victor BRITO
PS: Tu peux prendre la fonction pour ce qu'elle est: un moyen simple, rapide et non couteux d'éliminer la plupart du spam. Ce n'est pas la solution ultime pour sauver le monde des vilains robots du web.
Mais, un moyen qui peut être amélioré dans l'exhausitivité, d'où mes tentatives d'imitation de spam. ;)

Posté : 02 avr. 2008, 20:18
par Gofromiel
Je mis à jour la fonction. Liens <a></a> et ainsi que les adresses http://+ sont supprimées avant de procéder à la notation du corps, ce qui augmente encore les chances de virer du spam. Parce que franchement, une fois les adresses retirées il ne reste pas grand chose...

Posté : 14 avr. 2008, 21:32
par Gofromiel
J'ai encor mise à jour la fonction au niveau du compte des liens. Je ne cherche plus seulement 'http://' mais également 'href' et 'ftp'. Je fais un max() pour éviter de compter deux fois les "href="http://"...