Altrr-Press fait de l'anti-spam
2007-09-19 #ap
Pour l'instant, on ne peut pas vraiment dire que les sites réalisés avec Altrr-Press croulent sous le spam. Et une fois n'est pas coutumes, ce n'est vraiment dû à la qualité de son code mais au simple fait qu'aucun d'entre eux ne reçoit tant de visites que ça.
Malgré tout, j'ai quand même réussi à récolter quelques spammes :
- un site bar an se ren en ".com" souhaitait au fil de ses urls m'offrir des fleurs, des cadeaux ou des cartes de voeux,
- un autre cumulait le "free", le "linux" et le "forum" en .info pour mieux me proposer tout un arsenal de ouaib-cames libres ou pas,
- etc...
Mais quoiqu'il en soit, rien de catastrophique. Donc avant de sortir la grosse artillerie et de chercher à implémenter Askimet en C#, il y a certainement moyen de faire simple, vite et bien.
C'est même très facile parce que j'avais repéré il y a quelques temps un article de Joe Tan qui expliquait comment il avait réalisé un filtre anti-spam simple pour WordPress.
Son principe est vraiment tout simple. L'auteur a constaté que 90 % du spam dont il souffrait obéissait à l'une des 3 règles suivantes :
- il y a au minimum 5 liens vers des sites internet,
- il y a des liens en bbcode (style [url=http://www.example.com]example[/url]),
- on y retrouve fréquemment certains mots clés comme v-ag-a, c-alis...
La solution qu'il a mis au point consiste donc à tester ces 3 particularités et à suspecter le message d'être un spam dès lors que l'une d'entre elle s'applique.
Après quelques tests à base d'indexOf puis l'assistance de Philippe pour régixfier tout ça, la boite de Feedback d'Altrr-Press dispose maintenant d'une fonction IsSpam() qui le cas échéant permet de préfixer le sujet du message d'un "SPAM" accusateur.
public static bool isSpam (string content) {
// http://tantannoodles.com/toolkit/spam-filter/
content = content.ToLower();
bool isInvalid = false;
if (content.IndexOf(@"[url]http://") != -1) {
// [url]http://www.example.com[/url] style links => spam
isInvalid = true;
} else if (content.IndexOf(@"[url=http://") != -1) {
// [url=http://www.example.com]example[/url] style links => spam
isInvalid = true;
} else {
// remove internal link
content = content.Replace(Common.websiteUrl, "");
// 5 or more links to external sites => spam
if (Regex.Matches(content, @"http://").Count >= 5) {
isInvalid = true;
}
}
if (isInvalid == false) {
// potential spam words => spam
string bads = @"cialis|ebony|nude|porn|porno|pussy|upskirt|ringtones|phentermine|viagra";
if (Regex.IsMatch(content, bads) == true) {
isInvalid = true;
}
}
return isInvalid;
}
Et pour le jour où ça ne suffira plus, j'ai aussi un pôt de miel en réserve (à mon avis encore améliorable avec un attribut maxlength à zéro).