Détecter les spams avant qu'ils ne fassent du mal
nospam
fait un super boulot pour empêcher la publication des spams, mais évidemment il n'empêche pas les mécanismes SPIP qui se font avant cette détection, ou indépendamment d'elle.
En particulier, il n'empêche pas l'affichage de la page pour les spammers.
Or, la soumission d'un spam se fait via un formulaire, donc le plus souvent REQUEST_METHOD
vaut POST
, et dans ce cas là, les caches ne sont pas utilisés.
Cf extrait :
// Cas ignorant le cache car completement dynamique
if ((!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST') or _request('connect')) {
$use_cache = -1;...
Il y a certainement une raison pour laquelle un POST légitime ne doit pas utiliser les caches et doit provoquer les calculs (et ce serait bien de la phpdocumenter dans l'extrait ci dessus), mais la conséquence est que les spams provoquent les calculs de toutes les inclusions d'une page.
C'est ainsi que sur un site, un modèle couteux inséré dans le texte d'un article est recalculé plusieurs centaines de fois par heure. Pour éviter cela, j'ai bidouillé une fonction antispam light qui s'active lorsque $_SERVER['REQUEST_METHOD']==='POST'
et qui teste la variable $_POST['texte']
, car 'texte' est le champ utilisé pour les forums. Cette fonction évalue un score de spam basique sur la base de motclés, et die("un message d'erreur");
si un seuil est dépassé. Ainsi, pas d'affichage de la page, et pas de calcul SPIP inutile. Ça marche, mais les spams ne sont pas aussi bien détectés que par nospam, et pour l'instant c'est limité à 'texte' :-). Plutôt qu'une chtite fonction bidouillée, il vaudrait mieux appeler les fonctions de nospam (et sur les champs requis pour couvrir les différents formulaires déclarés).
D'où la demande : est-ce que nospam ne devrait pas de base (pouvoir) être appelé au plus tôt (dès mes_options en quasi-prepend php) pour éviter le calcul inutile des squelettes de la page ?