web-dev-qa-db-fra.com

Comment bloquer un agent utilisateur qui a un espacement dans son nom?

J'ai eu un hit d'un robot d'exploration avec un agent utilisateur appelé DV CRAWLER qui est un abotic un spam-bot. J'ai essayé de le bloquer dans les configurations .htacess et nginx car j'utilise nginx en tant que proxy inverse devant Apache.

Voici le code que j'ai utilisé pour .htaccess

RewriteCond %{HTTP_USER_AGENT} ^.*(Baiduspider|DV CRAWLER).*$ [NC]
RewriteRule .* - [F,L]

Il semble que l'espacement dans le nom de l'agent d'utilisateur ait brisé le code. J'ai découvert que cela ne fonctionne qu'avec des agents utilisateurs sans espaces. Même scénario avec nginx, il n'accepte pas d'espacement dans le nom de l'agent utilisateur et renvoie une erreur.

Code Nginx:

if ($http_user_agent ~ (Baiduspider|DV CRAWLER) ) {
return 403;
}

Alors, quelle est l'alternative pour cela? Je ne veux pas que ces robots collecteurs de spam explorent mon site Web. Toute réponse serait grandement appréciée.

2
Mina Hafzalla

Votre code de regex est en général faux.

Essayez plutôt quelque chose comme ça:

RewriteCond %{HTTP_USER_AGENT} (.*Baiduspider.*|.*DV.*CRAWLER.*) [NC]

Vous comparez une chaîne à chaque itération entre les parenthèses () séparées par le caractère de canal | alors que .* est un caractère générique qui correspond à tout. Vous pouvez éventuellement utiliser\s ou\s + pour les espaces mais .* fonctionne aussi et peut être meilleur. Ne sachant pas à quoi ressemble la chaîne DV CRAWLER, j'ai fait une supposition (Swag). Vous devrez peut-être ajuster ceci.

Par exemple: Une chaîne de ne ligne de voitures rouges conduisant dans la rue peut être associée simplement en utilisant .*red.*cars.*. Il existe des expressions régulières plus sournoises pour cela, mais cette méthode simple peut être répétée plusieurs fois en toute sécurité.

1
closetnoc

L'espace est un délimiteur (c'est-à-dire un caractère spécial) dans .htaccess. Vous devez donc utiliser une barre oblique inversée si vous souhaitez faire correspondre un espace littéral dans l'expression régulière. Par exemple. DV\ CRAWLER. (Sinon, vous obtiendrez probablement une erreur moins utile de 500 Internal Server.)

Ou bien, vous pouvez utiliser la classe de caractères abrégée \s qui correspond à tout caractère d'espace blanc (espace, tabulation ou nouvelle ligne/saut de ligne) - de sorte qu'il ne s'agit pas techniquement d'un espace.

3
MrWhite

En cas de doute, ajoutez des parenthèses et échappez aux expressions régulières. Essayez ceci en premier:

(Baiduspider|(DV CRAWLER))

Je pense que votre problème est qu’il s’évalue comme "Baiduspider ou DV suivi de CRAWLER" quand vous n’avez pas la paranthèse. Si cela ne fonctionne pas, essayez d'échapper à l'espace:

(Baiduspider|(DV\sCRAWLER))

\s est un caractère d'espacement.

1